@central-design-system/components 4.0.0-alpha.2 → 4.0.0-alpha.4

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 (478) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/MIGRATION.md +1 -1
  3. package/dist/browser/chunks/cdsLegacy-VUz8RzDN.js +120 -0
  4. package/dist/browser/chunks/useIcons.component-Df4MSurB.js +102 -0
  5. package/dist/browser/entry.js +31811 -0
  6. package/dist/browser/iconsets/carbon.js +155 -0
  7. package/dist/browser/iconsets/cds.js +149 -0
  8. package/dist/browser/iconsets/cdsLegacy.js +6 -0
  9. package/dist/browser/iconsets/lucide.js +156 -0
  10. package/dist/browser/iconsets/mdi.js +154 -0
  11. package/dist/browser/iconsets/phosphor.js +155 -0
  12. package/dist/browser/iconsets/remix.js +155 -0
  13. package/dist/cjs/entry.js +11 -11
  14. package/dist/es/entry.js +221 -202
  15. package/dist/es/entry.js.map +1 -1
  16. package/dist/es/src/cds.js +5 -5
  17. package/dist/es/src/components/CdsApp/CdsApp.vue_vue_type_script_setup_true_lang.js +1 -1
  18. package/dist/es/src/components/CdsApp/api/CdsApp.props.js +1 -1
  19. package/dist/es/src/components/CdsAvatar/CdsAvatar.vue_vue_type_script_setup_true_lang.js +1 -1
  20. package/dist/es/src/components/CdsAvatar/api/CdsAvatar.props.js +1 -1
  21. package/dist/es/src/components/CdsBadge/CdsBadge.vue_vue_type_script_setup_true_lang.js +1 -1
  22. package/dist/es/src/components/CdsBadge/api/CdsBadge.props.js +1 -1
  23. package/dist/es/src/components/CdsButton/CdsButton.vue_vue_type_script_setup_true_lang.js +1 -1
  24. package/dist/es/src/components/CdsButton/api/CdsButton.props.js +1 -1
  25. package/dist/es/src/components/CdsButtonGroup/CdsButtonGroup.vue_vue_type_script_setup_true_lang.js +1 -1
  26. package/dist/es/src/components/CdsButtonGroup/api/CdsButtonGroup.props.js +1 -1
  27. package/dist/es/src/components/CdsCard/CdsCard.vue_vue_type_script_setup_true_lang.js +1 -1
  28. package/dist/es/src/components/CdsCard/CdsCardGroup.vue_vue_type_script_setup_true_lang.js +1 -1
  29. package/dist/es/src/components/CdsCard/api/CdsCard.props.js +1 -1
  30. package/dist/es/src/components/CdsDatePicker/CdsDatePicker.vue_vue_type_script_setup_true_lang.js +1 -1
  31. package/dist/es/src/components/CdsDatePicker/api/CdsDatePicker.props.js +1 -1
  32. package/dist/es/src/components/CdsDivider/CdsDivider.vue_vue_type_script_setup_true_lang.js +1 -1
  33. package/dist/es/src/components/CdsDrawer/CdsDrawer.vue_vue_type_script_setup_true_lang.js +2 -2
  34. package/dist/es/src/components/CdsDrawer/api/CdsDrawer.props.js +1 -1
  35. package/dist/es/src/components/CdsEmptyState/CdsEmptyState.vue_vue_type_script_setup_true_lang.js +2 -2
  36. package/dist/es/src/components/CdsEmptyState/api/CdsEmptyState.props.js +1 -1
  37. package/dist/es/src/components/CdsExpandablePanel/CdsExpandablePanels.vue_vue_type_script_setup_true_lang.js +1 -1
  38. package/dist/es/src/components/CdsExpandablePanel/api/CdsExpandablePanel.props.js +1 -1
  39. package/dist/es/src/components/CdsField/CdsField.vue_vue_type_script_setup_true_lang.js +1 -1
  40. package/dist/es/src/components/CdsField/api/CdsField.props.js +1 -1
  41. package/dist/es/src/components/CdsFooter/CdsFooter.vue_vue_type_script_setup_true_lang.js +2 -2
  42. package/dist/es/src/components/CdsFooter/api/CdsFooter.props.js +1 -1
  43. package/dist/es/src/components/CdsFunctionalButton/api/CdsFunctionalButton.props.js +1 -1
  44. package/dist/es/src/components/CdsGrid/CdsCol.vue_vue_type_script_setup_true_lang.js +1 -1
  45. package/dist/es/src/components/CdsHeader/CdsHeader.vue_vue_type_script_setup_true_lang.js +1 -1
  46. package/dist/es/src/components/CdsHeader/api/CdsHeader.props.js +1 -1
  47. package/dist/es/src/components/CdsIcon/CdsIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  48. package/dist/es/src/components/CdsIcon/api/CdsIcon.props.js +1 -1
  49. package/dist/es/src/components/CdsImage/CdsImage.vue_vue_type_script_setup_true_lang.js +1 -1
  50. package/dist/es/src/components/CdsImage/api/CdsImage.props.js +1 -1
  51. package/dist/es/src/components/CdsInput/CdsInput.vue_vue_type_script_setup_true_lang.js +1 -1
  52. package/dist/es/src/components/CdsInput/api/CdsInput.props.js +1 -1
  53. package/dist/es/src/components/CdsLayout/CdsLayout.vue_vue_type_script_setup_true_lang.js +2 -2
  54. package/dist/es/src/components/CdsLayout/api/CdsLayout.props.js +1 -1
  55. package/dist/es/src/components/CdsLink/CdsLink.vue_vue_type_script_setup_true_lang.js +1 -1
  56. package/dist/es/src/components/CdsLink/api/CdsLink.props.js +1 -1
  57. package/dist/es/src/components/CdsList/CdsList.vue_vue_type_script_setup_true_lang.js +1 -1
  58. package/dist/es/src/components/CdsList/CdsListItem.vue_vue_type_script_setup_true_lang.js +1 -1
  59. package/dist/es/src/components/CdsList/api/CdsList.props.js +1 -1
  60. package/dist/es/src/components/CdsLoader/CdsLoader.vue_vue_type_script_setup_true_lang.js +1 -1
  61. package/dist/es/src/components/CdsNotification/CdsNotification.vue_vue_type_script_setup_true_lang.js +1 -1
  62. package/dist/es/src/components/CdsNotification/api/CdsNotification.props.js +1 -1
  63. package/dist/es/src/components/CdsOtpInput/CdsOtpField.js +2 -0
  64. package/dist/es/src/components/CdsOtpInput/CdsOtpField.js.map +1 -0
  65. package/dist/es/src/components/CdsOtpInput/CdsOtpField.vue_vue_type_script_setup_true_lang.js +62 -0
  66. package/dist/es/src/components/CdsOtpInput/CdsOtpField.vue_vue_type_script_setup_true_lang.js.map +1 -0
  67. package/dist/es/src/components/CdsOtpInput/CdsOtpGroup.js +2 -0
  68. package/dist/es/src/components/CdsOtpInput/CdsOtpGroup.js.map +1 -0
  69. package/dist/es/src/components/CdsOtpInput/CdsOtpGroup.vue_vue_type_script_setup_true_lang.js +51 -0
  70. package/dist/es/src/components/CdsOtpInput/CdsOtpGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  71. package/dist/es/src/components/CdsOtpInput/CdsOtpInput.css +204 -0
  72. package/dist/es/src/components/CdsOtpInput/CdsOtpInput.js +2 -0
  73. package/dist/es/src/components/CdsOtpInput/CdsOtpInput.js.map +1 -0
  74. package/dist/es/src/components/CdsOtpInput/CdsOtpInput.vue_vue_type_script_setup_true_lang.js +338 -0
  75. package/dist/es/src/components/CdsOtpInput/CdsOtpInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  76. package/dist/es/src/components/CdsOtpInput/CdsOtpSeparator.js +2 -0
  77. package/dist/es/src/components/CdsOtpInput/CdsOtpSeparator.js.map +1 -0
  78. package/dist/es/src/components/CdsOtpInput/CdsOtpSeparator.vue_vue_type_script_setup_true_lang.js +34 -0
  79. package/dist/es/src/components/CdsOtpInput/CdsOtpSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  80. package/dist/es/src/components/CdsOtpInput/api/CdsOtpInput.constants.js +16 -0
  81. package/dist/es/src/components/CdsOtpInput/api/CdsOtpInput.constants.js.map +1 -0
  82. package/dist/es/src/components/CdsOtpInput/api/CdsOtpInput.props.js +97 -0
  83. package/dist/es/src/components/CdsOtpInput/api/CdsOtpInput.props.js.map +1 -0
  84. package/dist/es/src/components/CdsOtpInput/api/CdsOtpInput.types.js +2 -0
  85. package/dist/es/src/components/CdsOtpInput/api/CdsOtpInput.types.js.map +1 -0
  86. package/dist/es/src/components/CdsOtpInput/composables/useOtpInput.js +329 -0
  87. package/dist/es/src/components/CdsOtpInput/composables/useOtpInput.js.map +1 -0
  88. package/dist/es/src/components/CdsOtpInput/index.js +17 -0
  89. package/dist/es/src/components/CdsOtpInput/index.js.map +1 -0
  90. package/dist/es/src/components/CdsOverlay/CdsOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  91. package/dist/es/src/components/CdsOverlay/api/CdsOverlay.props.js +1 -1
  92. package/dist/es/src/components/CdsPage/CdsPage.vue_vue_type_script_setup_true_lang.js +1 -1
  93. package/dist/es/src/components/CdsPagination/CdsPagination.vue_vue_type_script_setup_true_lang.js +2 -2
  94. package/dist/es/src/components/CdsPagination/api/CdsPagination.props.js +1 -1
  95. package/dist/es/src/components/CdsProgressBar/CdsProgressBar.vue_vue_type_script_setup_true_lang.js +1 -1
  96. package/dist/es/src/components/CdsProgressBar/api/CdsProgressBar.props.js +1 -1
  97. package/dist/es/src/components/CdsProgressCircle/CdsProgressCircle.vue_vue_type_script_setup_true_lang.js +1 -1
  98. package/dist/es/src/components/CdsProgressCircle/api/CdsProgressCircle.props.js +1 -1
  99. package/dist/es/src/components/CdsSkeletonLoader/CdsSkeletonLoader.vue_vue_type_script_setup_true_lang.js +1 -1
  100. package/dist/es/src/components/CdsSkeletonLoader/api/CdsSkeletonLoader.props.js +1 -1
  101. package/dist/es/src/components/CdsSlideGroup/CdsSlideGroup.vue_vue_type_script_setup_true_lang.js +1 -1
  102. package/dist/es/src/components/CdsSlideGroup/api/CdsSlideGroup.props.js +1 -1
  103. package/dist/es/src/components/CdsSlideView/api/CdsSlideView.props.js +1 -1
  104. package/dist/es/src/components/CdsStages/CdsStages.vue_vue_type_script_setup_true_lang.js +1 -1
  105. package/dist/es/src/components/CdsStages/api/CdsStages.props.js +1 -1
  106. package/dist/es/src/components/CdsStatus/CdsStatus.vue_vue_type_script_setup_true_lang.js +1 -1
  107. package/dist/es/src/components/CdsStatus/api/CdsStatus.props.js +1 -1
  108. package/dist/es/src/components/CdsSteps/api/CdsSteps.props.js +1 -1
  109. package/dist/es/src/components/CdsSurface/CdsSurface.vue_vue_type_script_setup_true_lang.js +1 -1
  110. package/dist/es/src/components/CdsSurface/api/CdsSurface.props.js +1 -1
  111. package/dist/es/src/components/CdsTable/api/CdsTable.props.js +1 -1
  112. package/dist/es/src/components/CdsTable/components/TableProvider.js +2 -2
  113. package/dist/es/src/components/CdsTag/CdsTag.vue_vue_type_script_setup_true_lang.js +1 -1
  114. package/dist/es/src/components/CdsTagGroup/CdsTagGroup.vue_vue_type_script_setup_true_lang.js +1 -1
  115. package/dist/es/src/components/CdsTagGroup/api/CdsTagGroup.props.js +1 -1
  116. package/dist/es/src/components/CdsTimePicker/CdsTimePicker.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/es/src/components/CdsTimePicker/api/CdsTimePicker.props.js +1 -1
  118. package/dist/es/src/components/CdsToast/CdsToast.vue_vue_type_script_setup_true_lang.js +1 -1
  119. package/dist/es/src/components/CdsToolbar/CdsToolbar.vue_vue_type_script_setup_true_lang.js +1 -1
  120. package/dist/es/src/components/CdsToolbar/api/CdsToolbar.props.js +1 -1
  121. package/dist/es/src/components/CdsTree/CdsTree.vue_vue_type_script_setup_true_lang.js +1 -1
  122. package/dist/es/src/components/CdsTree/api/CdsTree.props.js +1 -1
  123. package/dist/es/src/components/CdsUploader/CdsUploader.vue_vue_type_script_setup_true_lang.js +1 -1
  124. package/dist/es/src/components/index.js +10 -0
  125. package/dist/es/src/components/index.js.map +1 -1
  126. package/dist/es/src/composables/useHydration/useHydration.js +1 -1
  127. package/dist/es/src/composables/useLayout/useLayout.js +1 -1
  128. package/dist/es/src/composables/useTheme/internal/useTheme.constants.js +13 -2
  129. package/dist/es/src/composables/useTheme/internal/useTheme.constants.js.map +1 -1
  130. package/dist/es/src/composables/useVirtual/useVirtual.js +1 -1
  131. package/dist/es/src/core/useDefaults.js +3 -1
  132. package/dist/es/src/locales/adapters/cdsLocaleAdapter.js +2 -1
  133. package/dist/es/src/locales/adapters/cdsLocaleAdapter.js.map +1 -1
  134. package/dist/es/src/locales/en.js +70 -0
  135. package/dist/es/src/locales/en.js.map +1 -0
  136. package/dist/es/src/locales/index.js +18 -0
  137. package/dist/es/src/locales/index.js.map +1 -0
  138. package/dist/es/src/locales/ru.js +1 -0
  139. package/dist/es/src/locales/ru.js.map +1 -1
  140. package/dist/es/src/themes/index.js +4 -0
  141. package/dist/es/src/themes/index.js.map +1 -1
  142. package/dist/es/src/themes/lumaDark.js +20 -0
  143. package/dist/es/src/themes/lumaDark.js.map +1 -0
  144. package/dist/es/src/themes/lumaLight.js +20 -0
  145. package/dist/es/src/themes/lumaLight.js.map +1 -0
  146. package/dist/esm-node/entry.mjs +221 -202
  147. package/dist/esm-node/src/assets/icons/cdsLegacy.mjs +1 -1
  148. package/dist/esm-node/src/cds.mjs +6 -6
  149. package/dist/esm-node/src/components/CdsApp/CdsApp.vue_vue_type_script_setup_true_lang.mjs +2 -2
  150. package/dist/esm-node/src/components/CdsApp/api/CdsApp.props.mjs +1 -1
  151. package/dist/esm-node/src/components/CdsAutocomplete/CdsAutocomplete.vue_vue_type_script_setup_true_lang.mjs +3 -3
  152. package/dist/esm-node/src/components/CdsAutocomplete/api/CdsAutocomplete.props.mjs +1 -1
  153. package/dist/esm-node/src/components/CdsAvatar/CdsAvatar.vue_vue_type_script_setup_true_lang.mjs +3 -3
  154. package/dist/esm-node/src/components/CdsAvatar/api/CdsAvatar.props.mjs +1 -1
  155. package/dist/esm-node/src/components/CdsBadge/CdsBadge.vue_vue_type_script_setup_true_lang.mjs +3 -3
  156. package/dist/esm-node/src/components/CdsBadge/api/CdsBadge.props.mjs +2 -2
  157. package/dist/esm-node/src/components/CdsBreadcrumbs/CdsBreadcrumbs.vue_vue_type_script_setup_true_lang.mjs +1 -1
  158. package/dist/esm-node/src/components/CdsBreadcrumbs/CdsBreadcrumbsDivider.vue_vue_type_script_setup_true_lang.mjs +1 -1
  159. package/dist/esm-node/src/components/CdsBreadcrumbs/CdsBreadcrumbsItem.vue_vue_type_script_setup_true_lang.mjs +1 -1
  160. package/dist/esm-node/src/components/CdsBreadcrumbs/api/CdsBreadcrumbs.props.mjs +1 -1
  161. package/dist/esm-node/src/components/CdsButton/CdsButton.vue_vue_type_script_setup_true_lang.mjs +2 -2
  162. package/dist/esm-node/src/components/CdsButton/api/CdsButton.props.mjs +2 -2
  163. package/dist/esm-node/src/components/CdsButtonGroup/CdsButtonGroup.vue_vue_type_script_setup_true_lang.mjs +2 -2
  164. package/dist/esm-node/src/components/CdsButtonGroup/api/CdsButtonGroup.props.mjs +2 -2
  165. package/dist/esm-node/src/components/CdsButtonToggle/CdsButtonToggle.vue_vue_type_script_setup_true_lang.mjs +1 -1
  166. package/dist/esm-node/src/components/CdsButtonToggle/api/CdsButtonToggle.props.mjs +1 -1
  167. package/dist/esm-node/src/components/CdsCard/CdsCard.vue_vue_type_script_setup_true_lang.mjs +4 -4
  168. package/dist/esm-node/src/components/CdsCard/CdsCardActions.vue_vue_type_script_setup_true_lang.mjs +1 -1
  169. package/dist/esm-node/src/components/CdsCard/CdsCardDivider.vue_vue_type_script_setup_true_lang.mjs +2 -2
  170. package/dist/esm-node/src/components/CdsCard/CdsCardGroup.vue_vue_type_script_setup_true_lang.mjs +3 -3
  171. package/dist/esm-node/src/components/CdsCard/CdsCardItem.vue_vue_type_script_setup_true_lang.mjs +2 -2
  172. package/dist/esm-node/src/components/CdsCard/CdsCardSubtitle.vue_vue_type_script_setup_true_lang.mjs +1 -1
  173. package/dist/esm-node/src/components/CdsCard/CdsCardText.vue_vue_type_script_setup_true_lang.mjs +1 -1
  174. package/dist/esm-node/src/components/CdsCard/CdsCardTitle.vue_vue_type_script_setup_true_lang.mjs +1 -1
  175. package/dist/esm-node/src/components/CdsCard/api/CdsCard.constants.mjs +9 -9
  176. package/dist/esm-node/src/components/CdsCard/api/CdsCard.props.mjs +2 -2
  177. package/dist/esm-node/src/components/CdsCard/index.mjs +1 -1
  178. package/dist/esm-node/src/components/CdsCarousel/CdsCarousel.vue_vue_type_script_setup_true_lang.mjs +2 -2
  179. package/dist/esm-node/src/components/CdsCarousel/CdsCarouselItem.vue_vue_type_script_setup_true_lang.mjs +1 -1
  180. package/dist/esm-node/src/components/CdsCheckbox/CdsCheckbox.vue_vue_type_script_setup_true_lang.mjs +2 -2
  181. package/dist/esm-node/src/components/CdsCheckbox/api/CdsCheckbox.props.mjs +1 -1
  182. package/dist/esm-node/src/components/CdsCheckboxButton/CdsCheckboxButton.vue_vue_type_script_setup_true_lang.mjs +2 -2
  183. package/dist/esm-node/src/components/CdsCombobox/CdsCombobox.vue_vue_type_script_setup_true_lang.mjs +3 -3
  184. package/dist/esm-node/src/components/CdsCombobox/api/CdsCombobox.props.mjs +1 -1
  185. package/dist/esm-node/src/components/CdsCounter/CdsCounter.vue_vue_type_script_setup_true_lang.mjs +1 -1
  186. package/dist/esm-node/src/components/CdsDateInput/CdsDateInput.vue_vue_type_script_setup_true_lang.mjs +3 -3
  187. package/dist/esm-node/src/components/CdsDateInput/api/CdsDateInput.props.mjs +1 -1
  188. package/dist/esm-node/src/components/CdsDatePicker/CdsDatePicker.vue_vue_type_script_setup_true_lang.mjs +3 -3
  189. package/dist/esm-node/src/components/CdsDatePicker/api/CdsDatePicker.props.mjs +1 -1
  190. package/dist/esm-node/src/components/CdsDatePicker/composables/useCalendar.mjs +3 -3
  191. package/dist/esm-node/src/components/CdsDescription/CdsDescription.vue_vue_type_script_setup_true_lang.mjs +1 -1
  192. package/dist/esm-node/src/components/CdsDivider/CdsDivider.vue_vue_type_script_setup_true_lang.mjs +3 -3
  193. package/dist/esm-node/src/components/CdsDrawer/CdsDrawer.vue_vue_type_script_setup_true_lang.mjs +4 -4
  194. package/dist/esm-node/src/components/CdsDrawer/api/CdsDrawer.props.mjs +2 -2
  195. package/dist/esm-node/src/components/CdsEmptyState/CdsEmptyState.vue_vue_type_script_setup_true_lang.mjs +5 -5
  196. package/dist/esm-node/src/components/CdsEmptyState/api/CdsEmptyState.props.mjs +2 -2
  197. package/dist/esm-node/src/components/CdsExpandablePanel/CdsExpandablePanel.vue_vue_type_script_setup_true_lang.mjs +1 -1
  198. package/dist/esm-node/src/components/CdsExpandablePanel/CdsExpandablePanelContent.vue_vue_type_script_setup_true_lang.mjs +1 -1
  199. package/dist/esm-node/src/components/CdsExpandablePanel/CdsExpandablePanelTitle.vue_vue_type_script_setup_true_lang.mjs +1 -1
  200. package/dist/esm-node/src/components/CdsExpandablePanel/CdsExpandablePanels.vue_vue_type_script_setup_true_lang.mjs +3 -3
  201. package/dist/esm-node/src/components/CdsExpandablePanel/api/CdsExpandablePanel.props.mjs +2 -2
  202. package/dist/esm-node/src/components/CdsField/CdsField.vue_vue_type_script_setup_true_lang.mjs +2 -2
  203. package/dist/esm-node/src/components/CdsField/api/CdsField.props.mjs +2 -2
  204. package/dist/esm-node/src/components/CdsFileInput/CdsFileInput.vue_vue_type_script_setup_true_lang.mjs +2 -2
  205. package/dist/esm-node/src/components/CdsFileInput/api/CdsFileInput.props.mjs +1 -1
  206. package/dist/esm-node/src/components/CdsFileUpload/CdsFileUpload.vue_vue_type_script_setup_true_lang.mjs +2 -2
  207. package/dist/esm-node/src/components/CdsFileUpload/CdsFileUploadDropzone.vue_vue_type_script_setup_true_lang.mjs +1 -1
  208. package/dist/esm-node/src/components/CdsFileUpload/CdsFileUploadItem.vue_vue_type_script_setup_true_lang.mjs +1 -1
  209. package/dist/esm-node/src/components/CdsFileUpload/CdsFileUploadList.vue_vue_type_script_setup_true_lang.mjs +1 -1
  210. package/dist/esm-node/src/components/CdsFileUpload/api/CdsFileUpload.props.mjs +1 -1
  211. package/dist/esm-node/src/components/CdsFooter/CdsFooter.vue_vue_type_script_setup_true_lang.mjs +4 -4
  212. package/dist/esm-node/src/components/CdsFooter/api/CdsFooter.props.mjs +2 -2
  213. package/dist/esm-node/src/components/CdsForm/CdsForm.vue_vue_type_script_setup_true_lang.mjs +1 -1
  214. package/dist/esm-node/src/components/CdsFunctionalButton/api/CdsFunctionalButton.props.mjs +2 -2
  215. package/dist/esm-node/src/components/CdsGrid/CdsCol.vue_vue_type_script_setup_true_lang.mjs +2 -2
  216. package/dist/esm-node/src/components/CdsGrid/CdsRow.vue_vue_type_script_setup_true_lang.mjs +1 -1
  217. package/dist/esm-node/src/components/CdsGrid/api/CdsGrid.props.mjs +1 -1
  218. package/dist/esm-node/src/components/CdsGrid/components/CSSGrid.mjs +1 -1
  219. package/dist/esm-node/src/components/CdsGrid/components/FlexGrid.mjs +1 -1
  220. package/dist/esm-node/src/components/CdsHeader/CdsHeader.vue_vue_type_script_setup_true_lang.mjs +3 -3
  221. package/dist/esm-node/src/components/CdsHeader/api/CdsHeader.props.mjs +2 -2
  222. package/dist/esm-node/src/components/CdsHighlight/CdsHighlight.vue_vue_type_script_setup_true_lang.mjs +1 -1
  223. package/dist/esm-node/src/components/CdsHighlight/utils/toHighlight.mjs +1 -1
  224. package/dist/esm-node/src/components/CdsIcon/CdsIcon.vue_vue_type_script_setup_true_lang.mjs +3 -3
  225. package/dist/esm-node/src/components/CdsIcon/api/CdsIcon.props.mjs +1 -1
  226. package/dist/esm-node/src/components/CdsImage/CdsImage.vue_vue_type_script_setup_true_lang.mjs +4 -4
  227. package/dist/esm-node/src/components/CdsImage/api/CdsImage.props.mjs +1 -1
  228. package/dist/esm-node/src/components/CdsInput/CdsInput.vue_vue_type_script_setup_true_lang.mjs +2 -2
  229. package/dist/esm-node/src/components/CdsInput/CdsInputIcon.mjs +1 -1
  230. package/dist/esm-node/src/components/CdsInput/api/CdsInput.props.mjs +2 -2
  231. package/dist/esm-node/src/components/CdsLabel/CdsLabel.vue_vue_type_script_setup_true_lang.mjs +1 -1
  232. package/dist/esm-node/src/components/CdsLabel/api/CdsLabel.props.mjs +1 -1
  233. package/dist/esm-node/src/components/CdsLayout/CdsLayout.vue_vue_type_script_setup_true_lang.mjs +5 -5
  234. package/dist/esm-node/src/components/CdsLayout/api/CdsLayout.props.mjs +1 -1
  235. package/dist/esm-node/src/components/CdsLayout/internal/LayoutResizeObserver.mjs +1 -1
  236. package/dist/esm-node/src/components/CdsLayout/internal/LayoutScrollObserver.mjs +2 -2
  237. package/dist/esm-node/src/components/CdsLink/CdsLink.vue_vue_type_script_setup_true_lang.mjs +2 -2
  238. package/dist/esm-node/src/components/CdsLink/api/CdsLink.props.mjs +1 -1
  239. package/dist/esm-node/src/components/CdsList/CdsList.vue_vue_type_script_setup_true_lang.mjs +3 -3
  240. package/dist/esm-node/src/components/CdsList/CdsListGroup.vue_vue_type_script_setup_true_lang.mjs +1 -1
  241. package/dist/esm-node/src/components/CdsList/CdsListItem.vue_vue_type_script_setup_true_lang.mjs +3 -3
  242. package/dist/esm-node/src/components/CdsList/CdsListItemAction.vue_vue_type_script_setup_true_lang.mjs +1 -1
  243. package/dist/esm-node/src/components/CdsList/CdsListItemDivider.vue_vue_type_script_setup_true_lang.mjs +1 -1
  244. package/dist/esm-node/src/components/CdsList/CdsListItemMedia.vue_vue_type_script_setup_true_lang.mjs +1 -1
  245. package/dist/esm-node/src/components/CdsList/CdsListSubheader.vue_vue_type_script_setup_true_lang.mjs +1 -1
  246. package/dist/esm-node/src/components/CdsList/api/CdsList.props.mjs +2 -2
  247. package/dist/esm-node/src/components/CdsList/composables/useList.mjs +1 -1
  248. package/dist/esm-node/src/components/CdsLoader/CdsLoader.vue_vue_type_script_setup_true_lang.mjs +2 -2
  249. package/dist/esm-node/src/components/CdsMain/CdsMain.vue_vue_type_script_setup_true_lang.mjs +2 -2
  250. package/dist/esm-node/src/components/CdsMenu/CdsMenu.vue_vue_type_script_setup_true_lang.mjs +2 -2
  251. package/dist/esm-node/src/components/CdsMenu/api/CdsMenu.props.mjs +1 -1
  252. package/dist/esm-node/src/components/CdsMessages/CdsMessages.vue_vue_type_script_setup_true_lang.mjs +2 -2
  253. package/dist/esm-node/src/components/CdsModal/CdsModal.vue_vue_type_script_setup_true_lang.mjs +1 -1
  254. package/dist/esm-node/src/components/CdsNotification/CdsNotification.vue_vue_type_script_setup_true_lang.mjs +2 -2
  255. package/dist/esm-node/src/components/CdsNotification/api/CdsNotification.props.mjs +2 -2
  256. package/dist/esm-node/src/components/CdsNotificationAlert/CdsNotificationAlert.vue_vue_type_script_setup_true_lang.mjs +2 -2
  257. package/dist/esm-node/src/components/CdsNotificationAlert/api/CdsNotificationAlert.props.mjs +1 -1
  258. package/dist/esm-node/src/components/CdsOtpInput/CdsOtpField.mjs +2 -0
  259. package/dist/esm-node/src/components/CdsOtpInput/CdsOtpField.vue_vue_type_script_setup_true_lang.mjs +62 -0
  260. package/dist/esm-node/src/components/CdsOtpInput/CdsOtpGroup.mjs +2 -0
  261. package/dist/esm-node/src/components/CdsOtpInput/CdsOtpGroup.vue_vue_type_script_setup_true_lang.mjs +51 -0
  262. package/dist/esm-node/src/components/CdsOtpInput/CdsOtpInput.css +204 -0
  263. package/dist/esm-node/src/components/CdsOtpInput/CdsOtpInput.mjs +2 -0
  264. package/dist/esm-node/src/components/CdsOtpInput/CdsOtpInput.vue_vue_type_script_setup_true_lang.mjs +336 -0
  265. package/dist/esm-node/src/components/CdsOtpInput/CdsOtpSeparator.mjs +2 -0
  266. package/dist/esm-node/src/components/CdsOtpInput/CdsOtpSeparator.vue_vue_type_script_setup_true_lang.mjs +34 -0
  267. package/dist/esm-node/src/components/CdsOtpInput/api/CdsOtpInput.constants.mjs +16 -0
  268. package/dist/esm-node/src/components/CdsOtpInput/api/CdsOtpInput.props.mjs +97 -0
  269. package/dist/esm-node/src/components/CdsOtpInput/api/CdsOtpInput.types.mjs +2 -0
  270. package/dist/esm-node/src/components/CdsOtpInput/composables/useOtpInput.mjs +329 -0
  271. package/dist/esm-node/src/components/CdsOtpInput/index.mjs +17 -0
  272. package/dist/esm-node/src/components/CdsOverlay/CdsOverlay.vue_vue_type_script_setup_true_lang.mjs +6 -6
  273. package/dist/esm-node/src/components/CdsOverlay/api/CdsOverlay.props.mjs +1 -1
  274. package/dist/esm-node/src/components/CdsOverlay/components/Scrim.mjs +1 -1
  275. package/dist/esm-node/src/components/CdsOverlay/composables/useActivator.mjs +2 -2
  276. package/dist/esm-node/src/components/CdsOverlay/composables/useLocationStrategies.mjs +3 -3
  277. package/dist/esm-node/src/components/CdsOverlay/composables/useScrollStrategies.mjs +3 -3
  278. package/dist/esm-node/src/components/CdsPage/CdsPage.vue_vue_type_script_setup_true_lang.mjs +3 -3
  279. package/dist/esm-node/src/components/CdsPagination/CdsPagination.vue_vue_type_script_setup_true_lang.mjs +4 -4
  280. package/dist/esm-node/src/components/CdsPagination/api/CdsPagination.props.mjs +1 -1
  281. package/dist/esm-node/src/components/CdsProgressBar/CdsProgressBar.vue_vue_type_script_setup_true_lang.mjs +3 -3
  282. package/dist/esm-node/src/components/CdsProgressBar/api/CdsProgressBar.props.mjs +1 -1
  283. package/dist/esm-node/src/components/CdsProgressBar/composables/useChunk.mjs +1 -1
  284. package/dist/esm-node/src/components/CdsProgressCircle/CdsProgressCircle.vue_vue_type_script_setup_true_lang.mjs +4 -4
  285. package/dist/esm-node/src/components/CdsProgressCircle/api/CdsProgressCircle.props.mjs +1 -1
  286. package/dist/esm-node/src/components/CdsRadio/CdsRadio.vue_vue_type_script_setup_true_lang.mjs +1 -1
  287. package/dist/esm-node/src/components/CdsRadioGroup/CdsRadioGroup.vue_vue_type_script_setup_true_lang.mjs +2 -2
  288. package/dist/esm-node/src/components/CdsRadioGroup/api/CdsRadioGroup.props.mjs +1 -1
  289. package/dist/esm-node/src/components/CdsResponsive/CdsResponsive.vue_vue_type_script_setup_true_lang.mjs +1 -1
  290. package/dist/esm-node/src/components/CdsResponsive/composables/useAspectStyles.mjs +1 -1
  291. package/dist/esm-node/src/components/CdsSelect/CdsSelect.vue_vue_type_script_setup_true_lang.mjs +3 -3
  292. package/dist/esm-node/src/components/CdsSelect/api/CdsSelect.props.mjs +1 -1
  293. package/dist/esm-node/src/components/CdsSelectionControl/CdsSelectionControl.vue_vue_type_script_setup_true_lang.mjs +2 -2
  294. package/dist/esm-node/src/components/CdsSelectionControl/api/CdsSelectionControl.props.mjs +1 -1
  295. package/dist/esm-node/src/components/CdsSelectionControl/composables/useSelectionControl.mjs +1 -1
  296. package/dist/esm-node/src/components/CdsSelectionControlGroup/CdsSelectionControlGroup.vue_vue_type_script_setup_true_lang.mjs +1 -1
  297. package/dist/esm-node/src/components/CdsSelectionControlGroup/api/CdsSelectionControlGroup.props.mjs +1 -1
  298. package/dist/esm-node/src/components/CdsSkeletonLoader/CdsSkeletonLoader.vue_vue_type_script_setup_true_lang.mjs +3 -3
  299. package/dist/esm-node/src/components/CdsSkeletonLoader/api/CdsSkeletonLoader.props.mjs +1 -1
  300. package/dist/esm-node/src/components/CdsSlideGroup/CdsSlideGroup.vue_vue_type_script_setup_true_lang.mjs +4 -4
  301. package/dist/esm-node/src/components/CdsSlideGroup/api/CdsSlideGroup.props.mjs +1 -1
  302. package/dist/esm-node/src/components/CdsSlideView/CdsSlideView.vue_vue_type_script_setup_true_lang.mjs +4 -4
  303. package/dist/esm-node/src/components/CdsSlideView/CdsSlideViewItem.vue_vue_type_script_setup_true_lang.mjs +2 -2
  304. package/dist/esm-node/src/components/CdsSlideView/api/CdsSlideView.props.mjs +1 -1
  305. package/dist/esm-node/src/components/CdsStages/CdsStages.vue_vue_type_script_setup_true_lang.mjs +2 -2
  306. package/dist/esm-node/src/components/CdsStages/api/CdsStages.props.mjs +1 -1
  307. package/dist/esm-node/src/components/CdsStatus/CdsStatus.vue_vue_type_script_setup_true_lang.mjs +2 -2
  308. package/dist/esm-node/src/components/CdsStatus/api/CdsStatus.props.mjs +1 -1
  309. package/dist/esm-node/src/components/CdsSteps/CdsSteps.vue_vue_type_script_setup_true_lang.mjs +2 -2
  310. package/dist/esm-node/src/components/CdsSteps/CdsStepsActions.vue_vue_type_script_setup_true_lang.mjs +1 -1
  311. package/dist/esm-node/src/components/CdsSteps/CdsStepsItem.vue_vue_type_script_setup_true_lang.mjs +1 -1
  312. package/dist/esm-node/src/components/CdsSteps/CdsStepsView.vue_vue_type_script_setup_true_lang.mjs +1 -1
  313. package/dist/esm-node/src/components/CdsSteps/CdsStepsViewItem.vue_vue_type_script_setup_true_lang.mjs +1 -1
  314. package/dist/esm-node/src/components/CdsSteps/api/CdsSteps.props.mjs +2 -2
  315. package/dist/esm-node/src/components/CdsSurface/CdsSurface.vue_vue_type_script_setup_true_lang.mjs +2 -2
  316. package/dist/esm-node/src/components/CdsSurface/api/CdsSurface.props.mjs +1 -1
  317. package/dist/esm-node/src/components/CdsTable/api/CdsTable.props.mjs +1 -1
  318. package/dist/esm-node/src/components/CdsTable/components/Body/BodyRow.mjs +2 -2
  319. package/dist/esm-node/src/components/CdsTable/components/Cell/Cell.mjs +6 -6
  320. package/dist/esm-node/src/components/CdsTable/components/Drag/ColumnDragHandle.mjs +1 -1
  321. package/dist/esm-node/src/components/CdsTable/components/Drag/RowDragHandle.mjs +1 -1
  322. package/dist/esm-node/src/components/CdsTable/components/Filter/FilterDropdown.mjs +3 -3
  323. package/dist/esm-node/src/components/CdsTable/components/FixedHolder/FixedHolder.mjs +2 -2
  324. package/dist/esm-node/src/components/CdsTable/components/Header/DragHandle.mjs +4 -4
  325. package/dist/esm-node/src/components/CdsTable/components/Header/Header.mjs +1 -1
  326. package/dist/esm-node/src/components/CdsTable/components/Header/HeaderRow.mjs +1 -1
  327. package/dist/esm-node/src/components/CdsTable/components/ResizeObserver/ResizeObserver.mjs +1 -1
  328. package/dist/esm-node/src/components/CdsTable/components/StickyScrollbar/StickyScrollbar.mjs +3 -3
  329. package/dist/esm-node/src/components/CdsTable/components/Table/InternalTable.mjs +4 -4
  330. package/dist/esm-node/src/components/CdsTable/components/TableProvider.mjs +6 -6
  331. package/dist/esm-node/src/components/CdsTable/composable/columns.mjs +1 -1
  332. package/dist/esm-node/src/components/CdsTable/composable/filter.mjs +1 -1
  333. package/dist/esm-node/src/components/CdsTable/composable/frame.mjs +1 -1
  334. package/dist/esm-node/src/components/CdsTable/composable/pagination.mjs +2 -2
  335. package/dist/esm-node/src/components/CdsTable/composable/scroll.mjs +3 -3
  336. package/dist/esm-node/src/components/CdsTable/composable/selection.mjs +2 -2
  337. package/dist/esm-node/src/components/CdsTable/composable/sorter.mjs +1 -1
  338. package/dist/esm-node/src/components/CdsTable/composable/sticky.mjs +1 -1
  339. package/dist/esm-node/src/components/CdsTable/context/sticky.mjs +1 -1
  340. package/dist/esm-node/src/components/CdsTable/utils/column.mjs +1 -1
  341. package/dist/esm-node/src/components/CdsTabs/CdsTab.vue_vue_type_script_setup_true_lang.mjs +3 -3
  342. package/dist/esm-node/src/components/CdsTabs/CdsTabs.vue_vue_type_script_setup_true_lang.mjs +2 -2
  343. package/dist/esm-node/src/components/CdsTabs/CdsTabsView.vue_vue_type_script_setup_true_lang.mjs +1 -1
  344. package/dist/esm-node/src/components/CdsTabs/CdsTabsViewItem.vue_vue_type_script_setup_true_lang.mjs +1 -1
  345. package/dist/esm-node/src/components/CdsTabs/api/CdsTabs.props.mjs +1 -1
  346. package/dist/esm-node/src/components/CdsTag/CdsTag.vue_vue_type_script_setup_true_lang.mjs +2 -2
  347. package/dist/esm-node/src/components/CdsTag/api/CdsTag.props.mjs +1 -1
  348. package/dist/esm-node/src/components/CdsTagGroup/CdsTagGroup.vue_vue_type_script_setup_true_lang.mjs +2 -2
  349. package/dist/esm-node/src/components/CdsTagGroup/api/CdsTagGroup.props.mjs +2 -2
  350. package/dist/esm-node/src/components/CdsTextArea/CdsTextArea.vue_vue_type_script_setup_true_lang.mjs +2 -2
  351. package/dist/esm-node/src/components/CdsTextArea/api/CdsTextArea.props.mjs +1 -1
  352. package/dist/esm-node/src/components/CdsTextInput/CdsTextInput.vue_vue_type_script_setup_true_lang.mjs +2 -2
  353. package/dist/esm-node/src/components/CdsTextInput/api/CdsTextInput.props.mjs +1 -1
  354. package/dist/esm-node/src/components/CdsTimePicker/CdsTimePicker.vue_vue_type_script_setup_true_lang.mjs +3 -3
  355. package/dist/esm-node/src/components/CdsTimePicker/api/CdsTimePicker.props.mjs +1 -1
  356. package/dist/esm-node/src/components/CdsTimePicker/composables/useTime.mjs +1 -1
  357. package/dist/esm-node/src/components/CdsToast/CdsToast.vue_vue_type_script_setup_true_lang.mjs +3 -3
  358. package/dist/esm-node/src/components/CdsToast/api/CdsToast.props.mjs +1 -1
  359. package/dist/esm-node/src/components/CdsToastQueue/CdsToastQueue.vue_vue_type_script_setup_true_lang.mjs +1 -1
  360. package/dist/esm-node/src/components/CdsToastQueue/api/CdsToastQueue.props.mjs +1 -1
  361. package/dist/esm-node/src/components/CdsToastQueue/composables/useDocumentVisibility.mjs +1 -1
  362. package/dist/esm-node/src/components/CdsToggle/CdsToggle.vue_vue_type_script_setup_true_lang.mjs +2 -2
  363. package/dist/esm-node/src/components/CdsToggle/api/CdsToggle.props.mjs +1 -1
  364. package/dist/esm-node/src/components/CdsToolbar/CdsToolbar.vue_vue_type_script_setup_true_lang.mjs +2 -2
  365. package/dist/esm-node/src/components/CdsToolbar/CdsToolbarTitle.vue_vue_type_script_setup_true_lang.mjs +1 -1
  366. package/dist/esm-node/src/components/CdsToolbar/api/CdsToolbar.props.mjs +2 -2
  367. package/dist/esm-node/src/components/CdsTooltip/CdsTooltip.vue_vue_type_script_setup_true_lang.mjs +1 -1
  368. package/dist/esm-node/src/components/CdsTooltip/api/CdsTooltip.props.mjs +1 -1
  369. package/dist/esm-node/src/components/CdsTree/CdsTree.vue_vue_type_script_setup_true_lang.mjs +3 -3
  370. package/dist/esm-node/src/components/CdsTree/CdsTreeDirectory.vue_vue_type_script_lang.mjs +3 -3
  371. package/dist/esm-node/src/components/CdsTree/CdsTreeNode.vue_vue_type_script_lang.mjs +3 -3
  372. package/dist/esm-node/src/components/CdsTree/api/CdsTree.props.mjs +1 -1
  373. package/dist/esm-node/src/components/CdsTree/components/DropIndicator.mjs +1 -1
  374. package/dist/esm-node/src/components/CdsTree/components/NodeList.mjs +1 -1
  375. package/dist/esm-node/src/components/CdsTree/components/SwitcherIcon.mjs +2 -2
  376. package/dist/esm-node/src/components/CdsTree/components/TreeProvider.mjs +4 -4
  377. package/dist/esm-node/src/components/CdsTree/components/VirtualList/Filler.mjs +1 -1
  378. package/dist/esm-node/src/components/CdsTree/components/VirtualList/Item.mjs +1 -1
  379. package/dist/esm-node/src/components/CdsTree/components/VirtualList/ResizeObserver.mjs +1 -1
  380. package/dist/esm-node/src/components/CdsTree/components/VirtualList/ScrollBar.mjs +2 -2
  381. package/dist/esm-node/src/components/CdsTree/components/VirtualList/VirtualList.mjs +2 -2
  382. package/dist/esm-node/src/components/CdsTree/components/VirtualList/features/useFrameWheel.mjs +1 -1
  383. package/dist/esm-node/src/components/CdsTree/components/VirtualList/features/useHeights.mjs +1 -1
  384. package/dist/esm-node/src/components/CdsTree/components/VirtualList/features/useMobileTouchMove.mjs +1 -1
  385. package/dist/esm-node/src/components/CdsTree/utils/data.mjs +3 -3
  386. package/dist/esm-node/src/components/CdsUploader/CdsUploader.vue_vue_type_script_setup_true_lang.mjs +2 -2
  387. package/dist/esm-node/src/components/CdsUploader/components/AjaxUploader.vue_vue_type_script_setup_true_lang.mjs +2 -2
  388. package/dist/esm-node/src/components/CdsVirtualScroll/CdsVirtualScroll.vue_vue_type_script_setup_true_lang.mjs +4 -4
  389. package/dist/esm-node/src/components/CdsVirtualScroll/CdsVirtualScrollItem.vue_vue_type_script_setup_true_lang.mjs +1 -1
  390. package/dist/esm-node/src/components/index.mjs +10 -0
  391. package/dist/esm-node/src/composables/useColor/useColor.mjs +1 -1
  392. package/dist/esm-node/src/composables/useDatetime/useDatetime.mjs +2 -2
  393. package/dist/esm-node/src/composables/useDimensions/useDimensions.mjs +1 -1
  394. package/dist/esm-node/src/composables/useDisabled/index.mjs +1 -1
  395. package/dist/esm-node/src/composables/useDisplay/internal/useDisplay.helpers.mjs +1 -1
  396. package/dist/esm-node/src/composables/useDisplay/useDisplay.mjs +1 -1
  397. package/dist/esm-node/src/composables/useFilter/useFilter.mjs +1 -1
  398. package/dist/esm-node/src/composables/useFocus/useFocus.mjs +1 -1
  399. package/dist/esm-node/src/composables/useFocus/useFocusGroup.mjs +1 -1
  400. package/dist/esm-node/src/composables/useFocus/useFocusTrap.mjs +2 -2
  401. package/dist/esm-node/src/composables/useForm/useForm.mjs +1 -1
  402. package/dist/esm-node/src/composables/useGoTo/useGoTo.mjs +3 -3
  403. package/dist/esm-node/src/composables/useGroup/useGroup.mjs +1 -1
  404. package/dist/esm-node/src/composables/useHydration/useHydration.mjs +2 -2
  405. package/dist/esm-node/src/composables/useIcons/useIcons.mjs +1 -1
  406. package/dist/esm-node/src/composables/useItems/useItems.mjs +1 -1
  407. package/dist/esm-node/src/composables/useLayout/useLayout.mjs +2 -2
  408. package/dist/esm-node/src/composables/useLocation/useLocation.mjs +1 -1
  409. package/dist/esm-node/src/composables/useNested/strategies/activeStrategies.mjs +1 -1
  410. package/dist/esm-node/src/composables/useNested/useNested.mjs +2 -2
  411. package/dist/esm-node/src/composables/useResizeObserver/useResizeObserver.mjs +1 -1
  412. package/dist/esm-node/src/composables/useRouter/useRouter.mjs +1 -1
  413. package/dist/esm-node/src/composables/useSize/useSize.mjs +1 -1
  414. package/dist/esm-node/src/composables/useTeleport/useTeleport.mjs +2 -2
  415. package/dist/esm-node/src/composables/useTheme/internal/useTheme.constants.mjs +13 -2
  416. package/dist/esm-node/src/composables/useTheme/internal/useTheme.utils.mjs +2 -2
  417. package/dist/esm-node/src/composables/useTheme/useTheme.mjs +2 -2
  418. package/dist/esm-node/src/composables/useTransition/useTransition.mjs +1 -1
  419. package/dist/esm-node/src/composables/useValidation/useValidation.mjs +1 -1
  420. package/dist/esm-node/src/composables/useVirtual/useVirtual.mjs +2 -2
  421. package/dist/esm-node/src/core/defineComponent.mjs +2 -2
  422. package/dist/esm-node/src/core/getCurrentInstance.mjs +1 -1
  423. package/dist/esm-node/src/core/useDefaults.mjs +4 -2
  424. package/dist/esm-node/src/core/useProxyModel.mjs +1 -1
  425. package/dist/esm-node/src/hooks/createContext/index.mjs +1 -1
  426. package/dist/esm-node/src/hooks/createObserver/index.mjs +1 -1
  427. package/dist/esm-node/src/hooks/useBreakpoints/index.mjs +1 -1
  428. package/dist/esm-node/src/hooks/useEventListener/index.mjs +1 -1
  429. package/dist/esm-node/src/hooks/useHydration/index.mjs +1 -1
  430. package/dist/esm-node/src/hooks/useIntersectionObserver/index.mjs +1 -1
  431. package/dist/esm-node/src/hooks/useResizeObserver/index.mjs +1 -1
  432. package/dist/esm-node/src/icons.mjs +2 -2
  433. package/dist/esm-node/src/locales/adapters/cdsLocaleAdapter.mjs +3 -2
  434. package/dist/esm-node/src/locales/en.mjs +70 -0
  435. package/dist/esm-node/src/locales/index.mjs +18 -0
  436. package/dist/esm-node/src/locales/ru.mjs +1 -0
  437. package/dist/esm-node/src/themes/index.mjs +4 -0
  438. package/dist/esm-node/src/themes/lumaDark.mjs +20 -0
  439. package/dist/esm-node/src/themes/lumaLight.mjs +20 -0
  440. package/dist/esm-node/src/transitions/collapseTransition.mjs +1 -1
  441. package/dist/esm-node/src/transitions/createTransition.mjs +1 -1
  442. package/dist/esm-node/src/transitions/modalTransition.mjs +1 -1
  443. package/dist/esm-node/src/utils/colorsUtils/utils.mjs +2 -2
  444. package/dist/esm-node/src/utils/dom/classNames.mjs +1 -1
  445. package/dist/esm-node/src/utils/dom/console.mjs +1 -1
  446. package/dist/esm-node/src/utils/dom/dom.mjs +1 -1
  447. package/dist/iife/entry.js +11 -11
  448. package/dist/styles.css +2 -2
  449. package/dist/types/components/CdsOtpInput/CdsOtpField.vue.d.ts +25 -0
  450. package/dist/types/components/CdsOtpInput/CdsOtpGroup.vue.d.ts +34 -0
  451. package/dist/types/components/CdsOtpInput/CdsOtpInput.vue.d.ts +222 -0
  452. package/dist/types/components/CdsOtpInput/CdsOtpSeparator.vue.d.ts +25 -0
  453. package/dist/types/components/CdsOtpInput/api/CdsOtpInput.constants.d.ts +9 -0
  454. package/dist/types/components/CdsOtpInput/api/CdsOtpInput.props.d.ts +340 -0
  455. package/dist/types/components/CdsOtpInput/api/CdsOtpInput.types.d.ts +47 -0
  456. package/dist/types/components/CdsOtpInput/composables/useOtpInput.d.ts +76 -0
  457. package/dist/types/components/CdsOtpInput/index.d.ts +529 -0
  458. package/dist/types/components/index.d.ts +1 -0
  459. package/dist/types/composables/useTheme/internal/useTheme.constants.d.ts +1 -1
  460. package/dist/types/entry.d.ts +135 -123
  461. package/dist/types/locales/en.d.ts +1 -0
  462. package/dist/types/locales/index.d.ts +1 -0
  463. package/dist/types/locales/ru.d.ts +1 -0
  464. package/dist/types/themes/index.d.ts +4 -0
  465. package/dist/types/themes/lumaDark.d.ts +190 -0
  466. package/dist/types/themes/lumaLight.d.ts +190 -0
  467. package/llms/llms-components.txt +512 -1
  468. package/llms/llms-full.txt +1561 -11
  469. package/llms/llms-guides.txt +807 -10
  470. package/llms/llms-migration.txt +2 -2
  471. package/llms/llms-tokens.txt +243 -1
  472. package/llms/llms.txt +4 -3
  473. package/package.json +8 -1
  474. package/src/themes/css/lumaDark.css +184 -0
  475. package/src/themes/css/lumaLight.css +184 -0
  476. package/src/themes/index.ts +4 -0
  477. package/src/themes/lumaDark.ts +17 -0
  478. package/src/themes/lumaLight.ts +17 -0
@@ -1,6 +1,6 @@
1
1
  # Central Design System (CDS 4) — полная документация
2
2
 
3
- > Версия: 4.0.0-alpha.2
3
+ > Версия: 4.0.0-alpha.4
4
4
  > Всё сразу: гайды, токены и темы, компоненты с примерами и контрактом API, миграция с CDS 3.
5
5
  > Сгенерировано автоматически (`bun run generate:meta` → `bun run generate:llms`). Не редактировать вручную.
6
6
 
@@ -421,16 +421,18 @@ ThemeDefinition (TS) → --cds-color-* / --cds-* (CSS-переменные)
421
421
 
422
422
  ## Подключение темы
423
423
 
424
- CDS 4 поставляет шесть готовых тем:
424
+ CDS 4 поставляет восемь готовых тем:
425
425
 
426
- | Тема | Описание |
427
- | ------------- | ------------------------------------------- |
428
- | `cdsLight` | светлая тема, используется по умолчанию |
429
- | `cdsDark` | тёмная тема |
430
- | `b2bLight` | светлая тема для приложений B2B-Center |
431
- | `b2bDark` | тёмная тема для приложений B2B-Center |
432
- | `promoLight` | светлая промо-тема |
433
- | `promoDark` | тёмная промо-тема |
426
+ | Тема | Описание |
427
+ | ------------- |-----------------------------------------|
428
+ | `cdsLight` | светлая тема, используется по умолчанию |
429
+ | `cdsDark` | тёмная тема |
430
+ | `b2bLight` | светлая тема для приложений B2B-Center |
431
+ | `b2bDark` | тёмная тема для приложений B2B-Center |
432
+ | `lumaLight` | светлая тема Luma |
433
+ | `lumaDark` | тёмная тема Luma |
434
+ | `promoLight` | светлая промо-тема |
435
+ | `promoDark` | тёмная промо-тема |
434
436
 
435
437
  > По умолчанию используется `cdsLight` — подключать её не нужно.
436
438
 
@@ -1339,6 +1341,801 @@ defineRender(() => (
1339
1341
 
1340
1342
  ---
1341
1343
 
1344
+ # Глобальная конфигурация
1345
+
1346
+ CDS 4 позволяет задать значения пропсов по умолчанию — глобально, для конкретного компонента
1347
+ или только внутри определённого поддерева. Так вы один раз описываете «как выглядят кнопки
1348
+ в нашем продукте» и перестаёте дублировать одни и те же пропсы в каждом шаблоне.
1349
+
1350
+ ## Настройка
1351
+
1352
+ Значения по умолчанию задаются опцией `defaults` в `createCds`. Ключ `global` действует на все
1353
+ компоненты, ключ с именем компонента — только на него.
1354
+
1355
+ ```ts
1356
+ import { createApp } from 'vue';
1357
+ import '@central-design-system/components/styles';
1358
+ import { createCds, components, directives } from '@central-design-system/components';
1359
+
1360
+ import App from './App.vue';
1361
+
1362
+ const cds = createCds({
1363
+ components,
1364
+ directives,
1365
+ defaults: {
1366
+ global: {
1367
+ size: 'sm'
1368
+ },
1369
+ CdsButton: {
1370
+ appearance: 'secondary'
1371
+ },
1372
+ CdsTextInput: {
1373
+ hideDetails: 'auto'
1374
+ }
1375
+ }
1376
+ });
1377
+
1378
+ createApp(App).use(cds);
1379
+ ```
1380
+
1381
+ **Важно.** Пропсы в `defaults` пишутся в camelCase: `hideDetails`, а не `hide-details`.
1382
+
1383
+ Ключ компонента — это его имя из `defineOptions({ name })`, то есть `CdsButton`, `CdsTextInput`,
1384
+ `CdsCardActions` и так далее. Имена подкомпонентов (`CdsCardTitle`, `CdsListItem`) работают так же,
1385
+ как имена корневых.
1386
+
1387
+ ### Порядок разрешения значения
1388
+
1389
+ Для каждого пропса CDS берёт первое подходящее значение:
1390
+
1391
+ 1. проп, явно переданный в шаблоне;
1392
+ 2. `defaults.<ИмяКомпонента>.<проп>` из ближайшего контекста дефолтов;
1393
+ 3. `defaults.global.<проп>`;
1394
+ 4. значение по умолчанию, объявленное в самом компоненте.
1395
+
1396
+ Явно переданный проп всегда выигрывает — дефолты не могут «перебить» шаблон.
1397
+
1398
+ ### Изменение дефолтов в рантайме
1399
+
1400
+ `createCds` возвращает инстанс, у которого дефолты лежат в реактивной ссылке. Их можно менять
1401
+ на лету — все смонтированные компоненты пересчитаются:
1402
+
1403
+ ```ts
1404
+ const cds = createCds({ components, directives });
1405
+
1406
+ // например, включить компактный режим по настройке пользователя
1407
+ cds.defaults.value = {
1408
+ ...cds.defaults.value,
1409
+ global: { size: 'sm' }
1410
+ };
1411
+ ```
1412
+
1413
+ ## Контекстные дефолты
1414
+
1415
+ Дефолты можно задать для компонентов, вложенных в другой компонент. Например, чтобы все кнопки
1416
+ внутри карточки по умолчанию были вторичными:
1417
+
1418
+ ```ts
1419
+ createCds({
1420
+ defaults: {
1421
+ CdsCard: {
1422
+ CdsButton: { appearance: 'secondary' }
1423
+ }
1424
+ }
1425
+ });
1426
+ ```
1427
+
1428
+ Правило простое: ключ с заглавной буквы — это имя вложенного компонента, ключ со строчной —
1429
+ проп текущего компонента. Вложенность не ограничена одним уровнем:
1430
+
1431
+ ```ts
1432
+ createCds({
1433
+ defaults: {
1434
+ CdsCard: {
1435
+ CdsCardActions: {
1436
+ CdsButton: { appearance: 'tertiary', size: 'sm' }
1437
+ }
1438
+ }
1439
+ }
1440
+ });
1441
+ ```
1442
+
1443
+ Тот же механизм библиотека использует внутри себя, чтобы группирующие компоненты раздавали
1444
+ свои настройки детям:
1445
+
1446
+ - `CdsButtonGroup` задаёт вложенным `CdsButton` пропсы `appearance`, `color`, `baseColor`, `size`;
1447
+ - `CdsTagGroup` задаёт `CdsTag` пропсы `color`, `activeColor`, `disabled`, `filter`;
1448
+ - `CdsSelectionControlGroup` раздаёт настройки контролам, имя целевого компонента задаётся
1449
+ пропом `defaultsTarget` (`CdsCheckbox`, `CdsRadio` и т. д.);
1450
+ - так же работают `CdsTabs`, `CdsSteps`, `CdsList`, `CdsBreadcrumbs`, `CdsButtonToggle`,
1451
+ `CdsExpandablePanels`, `CdsOtpInput`.
1452
+
1453
+ Поэтому `<CdsButtonGroup size="sm">` делает маленькими все кнопки внутри — вам не нужно
1454
+ проставлять `size` каждой.
1455
+
1456
+ ## Глобальные класс и стиль
1457
+
1458
+ В дефолтах компонента, помимо пропсов, можно задать `class` и `style`. Это удобный способ
1459
+ навесить продуктовые правила на все экземпляры компонента, не трогая шаблоны:
1460
+
1461
+ ```ts
1462
+ createCds({
1463
+ defaults: {
1464
+ CdsButton: {
1465
+ class: 'my-button'
1466
+ }
1467
+ }
1468
+ });
1469
+ ```
1470
+
1471
+ Работает любое значение, которое принимает Vue, — строка, объект, массив:
1472
+
1473
+ ```ts
1474
+ createCds({
1475
+ defaults: {
1476
+ CdsButton: {
1477
+ style: [{ textTransform: 'none' }]
1478
+ }
1479
+ }
1480
+ });
1481
+ ```
1482
+
1483
+ В отличие от обычных пропсов, `class` и `style` не перезаписываются шаблоном, а **объединяются**
1484
+ с ним. То есть `<CdsButton class="mt-200">` получит и `my-button`, и `mt-200`.
1485
+
1486
+ **Важно.** `class` и `style` работают только в ключе конкретного компонента. В `global` они
1487
+ игнорируются.
1488
+
1489
+ ## Алиасы
1490
+
1491
+ Алиас — это тот же компонент, зарегистрированный под другим именем и со своими дефолтами.
1492
+ Из алиасов удобно собирать «продуктовые» варианты компонентов.
1493
+
1494
+ ```ts
1495
+ import { createCds, components, directives, CdsButton } from '@central-design-system/components';
1496
+
1497
+ const cds = createCds({
1498
+ components,
1499
+ directives,
1500
+ aliases: {
1501
+ CdsButtonPrimary: CdsButton,
1502
+ CdsButtonDanger: CdsButton
1503
+ },
1504
+ defaults: {
1505
+ CdsButtonPrimary: {
1506
+ appearance: 'primary',
1507
+ class: 'my-button--primary'
1508
+ },
1509
+ CdsButtonDanger: {
1510
+ appearance: 'primary',
1511
+ color: 'red',
1512
+ class: 'my-button--danger'
1513
+ }
1514
+ }
1515
+ });
1516
+ ```
1517
+
1518
+ Алиасы регистрируются глобально, поэтому в шаблоне их можно использовать сразу:
1519
+
1520
+ ```vue
1521
+ <template>
1522
+ <CdsButtonPrimary>Сохранить</CdsButtonPrimary>
1523
+ <CdsButtonDanger class="ml-200">Удалить</CdsButtonDanger>
1524
+ </template>
1525
+ ```
1526
+
1527
+ **Важно.** Алиас не наследует дефолты базового компонента. Если в конфигурации есть
1528
+ `defaults.CdsButton`, к `<CdsButtonPrimary>` они не применятся — дефолты ищутся по имени алиаса.
1529
+ Общие настройки для обоих выносите в `global` или дублируйте в ключе алиаса.
1530
+
1531
+ ## Дефолты для части приложения
1532
+
1533
+ Чтобы задать дефолты не глобально, а в поддереве, используйте компонент `CdsDefaultsProvider`.
1534
+ На нём же построена панель Controls в Storybook: значения из панели применяются
1535
+ к компонентам примера как дефолты.
1536
+
1537
+ ```vue
1538
+ <script setup lang="ts">
1539
+ import { CdsButton, CdsDefaultsProvider } from '@central-design-system/components';
1540
+ </script>
1541
+
1542
+ <template>
1543
+ <CdsDefaultsProvider :defaults="{ CdsButton: { appearance: 'tertiary', size: 'sm' } }">
1544
+ <CdsButton>Второстепенная маленькая кнопка</CdsButton>
1545
+ </CdsDefaultsProvider>
1546
+ </template>
1547
+ ```
1548
+
1549
+ | Проп | Тип | Назначение |
1550
+ | ---------- | ------------------- | -------------------------------------------------------------------------------------------- |
1551
+ | `defaults` | `DefaultsOptions` | Дефолты для поддерева; по умолчанию мержатся с унаследованными |
1552
+ | `scoped` | `boolean` | Не смешивать с родительскими дефолтами — действуют только заданные здесь |
1553
+ | `reset` | `number \| string` | Подняться на N уровней вверх по цепочке дефолтов |
1554
+ | `root` | `boolean \| string` | Вернуться к корневым дефолтам из `createCds`; строкой — к именованной группе внутри них |
1555
+ | `disabled` | `boolean` | Ничего не провайдить — поддерево получает дефолты родителя как есть |
1556
+
1557
+ Типичный сценарий `scoped` — «островок» в чужом окружении: вложенные группы (например,
1558
+ `CdsButtonGroup`) не должны навязывать свои настройки вашему блоку.
1559
+
1560
+ ## Свои компоненты
1561
+
1562
+ Собственные компоненты приложения тоже могут участвовать в системе дефолтов. Для этого
1563
+ пропустите пропсы через `useDefaults`:
1564
+
1565
+ ```vue
1566
+ <script setup lang="ts">
1567
+ import { useDefaults } from '@central-design-system/components';
1568
+
1569
+ const _props = defineProps<{ foo?: string }>();
1570
+ const props = useDefaults(_props, 'MyComponent');
1571
+ </script>
1572
+
1573
+ <template>
1574
+ <div>Я {{ props.foo }}</div>
1575
+ </template>
1576
+ ```
1577
+
1578
+ У `useDefaults` два аргумента, оба опциональные:
1579
+
1580
+ - `props` — объект пропсов, возвращённый `defineProps`;
1581
+ - `name` — имя компонента, по которому ищется ключ в `defaults`. Если не передать, берётся имя
1582
+ из `defineOptions({ name })`, а при его отсутствии — имя файла.
1583
+
1584
+ Теперь компонент настраивается из общей конфигурации:
1585
+
1586
+ ```ts
1587
+ createCds({
1588
+ defaults: {
1589
+ MyComponent: { foo: 'бар' }
1590
+ }
1591
+ });
1592
+ ```
1593
+
1594
+ **Важно.** В шаблоне обращайтесь к `props.foo`, а не к `foo`. `useDefaults` возвращает прокси
1595
+ над пропсами, и распакованные `defineProps` переменные его минуют:
1596
+
1597
+ ```diff
1598
+ -<div>Я {{ foo }}</div>
1599
+ +<div>Я {{ props.foo }}</div>
1600
+ ```
1601
+
1602
+ ### Вложенные дефолты в своих компонентах
1603
+
1604
+ Чтобы ваш компонент раздавал дефолты детям (как это делает `CdsButtonGroup`), достаточно
1605
+ вызвать `useDefaults()` без аргументов — вложенные ключи из его секции `defaults` уйдут в
1606
+ дочерний контекст:
1607
+
1608
+ ```vue
1609
+ <script setup lang="ts">
1610
+ import { useDefaults } from '@central-design-system/components';
1611
+
1612
+ useDefaults();
1613
+ </script>
1614
+
1615
+ <template>
1616
+ <div class="my-panel">
1617
+ <slot />
1618
+ </div>
1619
+ </template>
1620
+ ```
1621
+
1622
+ ```ts
1623
+ createCds({
1624
+ defaults: {
1625
+ MyPanel: {
1626
+ CdsButton: { appearance: 'tertiary' }
1627
+ }
1628
+ }
1629
+ });
1630
+ ```
1631
+
1632
+ Если дефолты детей зависят от пропсов компонента, используйте `provideDefaults` напрямую:
1633
+
1634
+ ```vue
1635
+ <script setup lang="ts">
1636
+ import { provideDefaults } from '@central-design-system/components';
1637
+ import { toRef } from 'vue';
1638
+
1639
+ const props = defineProps<{ size?: 'sm' | 'md' }>();
1640
+
1641
+ provideDefaults({
1642
+ CdsButton: {
1643
+ size: toRef(() => props.size)
1644
+ }
1645
+ });
1646
+ </script>
1647
+
1648
+ <template>
1649
+ <div class="my-toolbar">
1650
+ <slot />
1651
+ </div>
1652
+ </template>
1653
+ ```
1654
+
1655
+ ## Blueprint — пресет конфигурации
1656
+
1657
+ Если один и тот же набор опций нужен нескольким приложениям, вынесите его в `blueprint`:
1658
+ это обычный объект опций `createCds`, на который сверху накладывается остальная конфигурация.
1659
+
1660
+ ```ts
1661
+ import { createCds, components, directives } from '@central-design-system/components';
1662
+ import type { Blueprint } from '@central-design-system/components';
1663
+
1664
+ const productBlueprint: Blueprint = {
1665
+ theme: { defaultTheme: 'b2bLight' },
1666
+ defaults: {
1667
+ CdsButton: { appearance: 'secondary' }
1668
+ }
1669
+ };
1670
+
1671
+ const cds = createCds({
1672
+ blueprint: productBlueprint,
1673
+ components,
1674
+ directives,
1675
+ // перекрывает значение из blueprint
1676
+ defaults: {
1677
+ CdsButton: { size: 'sm' }
1678
+ }
1679
+ });
1680
+ ```
1681
+
1682
+ Опции сливаются глубоко (`mergeDeep`), поэтому в примере выше у кнопок останется
1683
+ `appearance: 'secondary'` из пресета и добавится `size: 'sm'`.
1684
+
1685
+ ---
1686
+
1687
+ # Интернационализация (i18n)
1688
+
1689
+ У компонентов CDS есть собственные тексты: «Отсутствуют данные» в селекте, подписи фильтров
1690
+ таблицы, `aria-label` кнопки закрытия, счётчик файлов. Все они идут через встроенный слой
1691
+ локализации, поэтому вы можете перевести их на другой язык, переопределить отдельную строку под
1692
+ свой продукт или переключать язык на лету — не переписывая компоненты.
1693
+
1694
+ В библиотеку встроены два словаря — русский и английский. По умолчанию активен `ru`, поэтому без
1695
+ настройки всё уже на русском.
1696
+
1697
+ ## Настройка
1698
+
1699
+ Локаль настраивается опцией `locale` в `createCds`. Переключиться на встроенный английский —
1700
+ одна строка, словари для этого передавать не нужно:
1701
+
1702
+ ```ts
1703
+ import { createApp } from 'vue';
1704
+ import '@central-design-system/components/styles';
1705
+ import { createCds, components, directives } from '@central-design-system/components';
1706
+
1707
+ import App from './App.vue';
1708
+
1709
+ const cds = createCds({
1710
+ components,
1711
+ directives,
1712
+ locale: {
1713
+ locale: 'en'
1714
+ }
1715
+ });
1716
+
1717
+ createApp(App).use(cds);
1718
+ ```
1719
+
1720
+ Языки, которых в библиотеке нет, добавляются словарём в `messages`:
1721
+
1722
+ ```ts
1723
+ import de from './locales/cds-de';
1724
+
1725
+ createCds({
1726
+ components,
1727
+ directives,
1728
+ locale: {
1729
+ locale: 'de',
1730
+ fallback: 'en',
1731
+ messages: { de }
1732
+ }
1733
+ });
1734
+ ```
1735
+
1736
+ | Опция | Тип | Назначение |
1737
+ | ------------------ | ------------------------- | ----------------------------------------------------------------------------- |
1738
+ | `locale` | `string` | Активный язык; из коробки доступны `ru` (по умолчанию) и `en` |
1739
+ | `fallback` | `string` | Язык, из которого берётся строка, если в активном её нет; по умолчанию `ru` |
1740
+ | `messages` | `LocaleMessages` | Словари дополнительных языков; словарь одноимённого встроенного заменяется целиком |
1741
+ | `decimalSeparator` | `string` | Разделитель дробной части; по умолчанию выводится из активной локали |
1742
+ | `rtl` | `Record<string, boolean>` | Карта языков с письмом справа налево (см. [RTL](#rtl)) |
1743
+ | `adapter` | `LocaleInstance` | Свой движок переводов вместо встроенного (см. [Свой адаптер](#свои-адаптер)) |
1744
+
1745
+ Встроенные словари доступны и вам — они лежат в экспорте `locales`. Берите их за основу для
1746
+ своего языка или чтобы поправить пару строк:
1747
+
1748
+ ```ts
1749
+ import { locales } from '@central-design-system/components';
1750
+
1751
+ locales.ru; // русский словарь
1752
+ locales.en; // английский словарь
1753
+ ```
1754
+
1755
+ Полный набор ключей — в разделе [Ключи сообщений](#ключи-сообщении).
1756
+
1757
+ ## Как компоненты берут текст
1758
+
1759
+ Строки компонентов — это ключи с префиксом `$cds.`, которые библиотека прогоняет через функцию
1760
+ перевода. Часть ключей объявлена значениями пропсов по умолчанию, поэтому их видно в API:
1761
+ `text` у `CdsFileUpload` — `$cds.fileUpload.browse`, `closeLabel` у `CdsNotification` — `$cds.close`,
1762
+ `noDataText` у `CdsSelect` — `$cds.noDataText`.
1763
+
1764
+ Отсюда три способа поменять текст.
1765
+
1766
+ **Сменить язык целиком** — опцией `locale`:
1767
+
1768
+ ```ts
1769
+ createCds({ locale: { locale: 'en' } });
1770
+ ```
1771
+
1772
+ **Поменять надписи во всём продукте** — словарём поверх встроенного:
1773
+
1774
+ ```ts
1775
+ import { createCds, locales } from '@central-design-system/components';
1776
+
1777
+ createCds({
1778
+ locale: {
1779
+ messages: {
1780
+ ru: { ...locales.ru, noDataText: 'Ничего не нашлось' }
1781
+ }
1782
+ }
1783
+ });
1784
+ ```
1785
+
1786
+ **Важно.** Словарь языка заменяется целиком, а не сливается по ключам. Без спреда
1787
+ `...locales.ru` в русской локали останется один ключ, а остальные строки превратятся
1788
+ в свои же ключи (`$cds.close` вместо «Закрыть»). Вложенные секции спредьте отдельно:
1789
+ `table: { ...locales.ru.table, emptyText: '…' }`.
1790
+
1791
+ **Поменять одну надпись в одном месте** — пропсом:
1792
+
1793
+ ```vue
1794
+ <CdsSelect :items="items" no-data-text="Подходящих поставщиков нет" />
1795
+ ```
1796
+
1797
+ Тот же проп можно задать значением по умолчанию для всех экземпляров компонента —
1798
+ см. глобальную конфигурацию:
1799
+
1800
+ ```ts
1801
+ createCds({
1802
+ defaults: {
1803
+ CdsSelect: { noDataText: 'Ничего не нашлось' }
1804
+ }
1805
+ });
1806
+ ```
1807
+
1808
+ Функция перевода принимает и обычный текст: строка без префикса `$cds.` возвращается как есть,
1809
+ подставляя параметры. Так пропсы с локализуемым значением работают одинаково и с ключом,
1810
+ и с готовой фразой.
1811
+
1812
+ Если ключа нет ни в активной локали, ни в `fallback`, компонент покажет сам ключ, а в dev-режиме
1813
+ в консоли появится предупреждение `[CDS: useLocale] Translation key … not found`.
1814
+
1815
+ ## Смена языка в рантайме
1816
+
1817
+ `createCds` возвращает инстанс, у которого локаль лежит в реактивных ссылках — переключение
1818
+ языка достаточно записать в `current`:
1819
+
1820
+ ```ts
1821
+ const cds = createCds({ components, directives });
1822
+
1823
+ // например, по выбору пользователя в настройках профиля
1824
+ cds.locale.current.value = 'en';
1825
+ ```
1826
+
1827
+ Внутри компонентов то же делает композабл `useLocale`:
1828
+
1829
+ ```vue
1830
+ <script setup lang="ts">
1831
+ import { CdsButton, CdsButtonToggle, useLocale } from '@central-design-system/components';
1832
+
1833
+ const { current } = useLocale();
1834
+ </script>
1835
+
1836
+ <template>
1837
+ <CdsButtonToggle v-model="current" appearance="tertiary">
1838
+ <CdsButton value="ru" text="Русский" />
1839
+ <CdsButton value="en" text="English" />
1840
+ </CdsButtonToggle>
1841
+ </template>
1842
+ ```
1843
+
1844
+ Все смонтированные компоненты пересчитают свои строки сами — перезагрузка страницы не нужна.
1845
+
1846
+ ## Локаль для части приложения
1847
+
1848
+ Отдельному поддереву можно задать свой язык — например, показать англоязычный виджет внутри
1849
+ русского интерфейса. Для этого в компоненте-обёртке вызовите `provideLocale`: он берёт локаль
1850
+ из контекста, накладывает переданные пропсы и провайдит результат детям.
1851
+
1852
+ ```vue
1853
+ <script setup lang="ts">
1854
+ import { provideLocale } from '@central-design-system/components';
1855
+
1856
+ const props = defineProps<{ locale?: string; fallback?: string }>();
1857
+
1858
+ provideLocale(props);
1859
+ </script>
1860
+
1861
+ <template>
1862
+ <div>
1863
+ <slot />
1864
+ </div>
1865
+ </template>
1866
+ ```
1867
+
1868
+ ```vue
1869
+ <template>
1870
+ <LocaleProvider locale="en">
1871
+ <CdsSelect :items="items" />
1872
+ </LocaleProvider>
1873
+ </template>
1874
+ ```
1875
+
1876
+ Не переданные пропсы наследуются от родительской локали, поэтому обёртка с одним `locale`
1877
+ не теряет ни `fallback`, ни словари.
1878
+
1879
+ ## useLocale
1880
+
1881
+ Композабл отдаёт текущую локаль и её функции — используйте его в своих компонентах, чтобы их
1882
+ тексты жили в тех же словарях, что и тексты CDS.
1883
+
1884
+ ```vue
1885
+ <script setup lang="ts">
1886
+ import { useLocale } from '@central-design-system/components';
1887
+
1888
+ const { t, n } = useLocale();
1889
+ </script>
1890
+
1891
+ <template>
1892
+ <p>{{ t('$cds.table.emptyText') }}</p>
1893
+ <p>{{ n(1234.56) }}</p>
1894
+ </template>
1895
+ ```
1896
+
1897
+ | Свойство | Тип | Назначение |
1898
+ | ------------------ | ---------------------------------------------- | ------------------------------------------------------------- |
1899
+ | `t` | `(key: string, ...params: unknown[]) => string` | Перевод ключа `$cds.…` с подстановкой параметров |
1900
+ | `n` | `(value: number) => string` | Форматирование числа по активной локали |
1901
+ | `current` | `Ref<string>` | Активный язык; запись меняет язык |
1902
+ | `fallback` | `Ref<string>` | Язык-подстраховка |
1903
+ | `messages` | `Ref<LocaleMessages>` | Словари; можно дописывать в рантайме |
1904
+ | `decimalSeparator` | `ShallowRef<string>` | Разделитель дробной части активной локали |
1905
+
1906
+ Параметры в строках нумерованные — `{0}`, `{1}`:
1907
+
1908
+ ```ts
1909
+ const { t } = useLocale();
1910
+
1911
+ t('$cds.carousel.delimiter', 3, 8); // «Слайд 3 из 8»
1912
+ t('Осталось дней: {0}', 5); // «Осталось дней: 5»
1913
+ ```
1914
+
1915
+ `n` под капотом — `Intl.NumberFormat` с активной локалью и `fallback`, так что разделители групп
1916
+ и дробной части приходят из браузера. `decimalSeparator` библиотека выводит из той же локали
1917
+ (`,` для `ru`, `.` для `en`); если в продукте принят другой — задайте его явно в `createCds`.
1918
+
1919
+ ## Даты
1920
+
1921
+ Названия месяцев и дней недели живут в отдельных date-локалях: их везут `ru` и `en`. Компоненты
1922
+ даты и времени берут date-локаль по активному языку, поэтому после `current.value = 'en'` календарь
1923
+ переключится сам.
1924
+
1925
+ Одному компоненту язык задаётся пропом `locale` — он есть у `CdsDatePicker`, `CdsDateInput`
1926
+ и `CdsTimePicker`:
1927
+
1928
+ ```vue
1929
+ <CdsDatePicker v-model="value" locale="en" :first-day-of-week="0" header />
1930
+ ```
1931
+
1932
+ Проп принимает не только имя языка, но и свой объект date-локали (тип `TDateLocale`) — так
1933
+ подключается язык, которого в библиотеке нет. Встроенные date-локали для сверки и переиспользования
1934
+ лежат в том же экспорте `locales`: `locales.ruDate`, `locales.enDate` и карта `locales.dateLocales`.
1935
+
1936
+ ```ts
1937
+ const de = {
1938
+ days: 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
1939
+ daysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
1940
+ months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
1941
+ monthsLong: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
1942
+ monthsShort: 'Jan_Feb_Mär_Apr_Mai_Jun_Jul_Aug_Sep_Okt_Nov_Dez'.split('_'),
1943
+ today: 'Heute',
1944
+ now: 'Jetzt',
1945
+ firstDayOfWeek: 1,
1946
+ format24h: true,
1947
+ pluralDay: (day = 0) => (day === 1 ? 'Tag' : 'Tage')
1948
+ };
1949
+ ```
1950
+
1951
+ ```vue
1952
+ <CdsDatePicker v-model="value" :locale="de" />
1953
+ ```
1954
+
1955
+ ## Таблица
1956
+
1957
+ `CdsTable` собирает свои подписи из ключей `$cds.table.*`, но принимает и точечное
1958
+ переопределение пропом `locale` — он перекрывает только переданные строки:
1959
+
1960
+ ```vue
1961
+ <CdsTable :columns="columns" :data="data" :locale="{ emptyText: 'Заявок пока нет' }" />
1962
+ ```
1963
+
1964
+ ## RTL
1965
+
1966
+ Языки с письмом справа налево описываются картой `rtl`: ключ — язык, значение — направление.
1967
+
1968
+ ```ts
1969
+ createCds({
1970
+ locale: {
1971
+ locale: 'ar',
1972
+ messages: { ar },
1973
+ rtl: { ar: true }
1974
+ }
1975
+ });
1976
+ ```
1977
+
1978
+ Компоненты читают направление через `useRtl` и разворачивают то, что зависит от оси: сторону
1979
+ раскрытия меню и тултипов, стрелки пагинации, порядок ячеек `CdsOtpInput`, заливку
1980
+ `CdsProgressBar`. Отступы и границы в стилях в основном описаны логическими свойствами
1981
+ (`margin-inline`, `inset-inline`) и зеркалятся браузером сами — но полноценной поддержки RTL
1982
+ дизайн-система пока не заявляет, отдельные места потребуют доводки на вашей стороне.
1983
+
1984
+ Атрибут направления библиотека за вас не проставляет — повесьте его на корень приложения сами:
1985
+
1986
+ ```vue
1987
+ <script setup lang="ts">
1988
+ import { useRtl } from '@central-design-system/components';
1989
+
1990
+ const { isRtl } = useRtl();
1991
+ </script>
1992
+
1993
+ <template>
1994
+ <div :dir="isRtl ? 'rtl' : 'ltr'">
1995
+ <slot />
1996
+ </div>
1997
+ </template>
1998
+ ```
1999
+
2000
+ `useRtl` отдаёт `isRtl` и `rtlClasses` — готовый класс `cds-locale--is-rtl` / `cds-locale--is-ltr`
2001
+ для ваших собственных стилей.
2002
+
2003
+ ## Свой адаптер
2004
+
2005
+ Если в приложении уже есть i18n-библиотека, отдайте переводы ей: опция `adapter` принимает любой
2006
+ объект, реализующий интерфейс `LocaleInstance`. Тогда `messages`, `locale` и `fallback` из
2007
+ `createCds` не используются — источником истины становится ваш движок, а строки CDS живут
2008
+ в общих словарях приложения под ключом `$cds`.
2009
+
2010
+ ```ts
2011
+ import type { LocaleInstance, LocaleOptions } from '@central-design-system/components';
2012
+ import { toRef } from 'vue';
2013
+ import type { I18n } from 'vue-i18n';
2014
+
2015
+ export function createVueI18nAdapter(i18n: I18n<any, any, any, string, false>): LocaleInstance {
2016
+ const format = (value: number) => i18n.global.n(value);
2017
+
2018
+ return {
2019
+ name: 'vue-i18n',
2020
+ current: i18n.global.locale,
2021
+ fallback: i18n.global.fallbackLocale as never,
2022
+ messages: i18n.global.messages as never,
2023
+ decimalSeparator: toRef(() => (format(0.1).includes(',') ? ',' : '.')),
2024
+ t: (key, ...params) => i18n.global.t(key, params as never),
2025
+ n: format,
2026
+ provide: () => createVueI18nAdapter(i18n)
2027
+ };
2028
+ }
2029
+ ```
2030
+
2031
+ ```ts
2032
+ import { createI18n } from 'vue-i18n';
2033
+
2034
+ const i18n = createI18n({
2035
+ legacy: false,
2036
+ locale: 'ru',
2037
+ messages: {
2038
+ ru: {
2039
+ $cds: { noDataText: 'Отсутствуют данные' },
2040
+ profile: { title: 'Профиль' }
2041
+ }
2042
+ }
2043
+ });
2044
+
2045
+ const cds = createCds({
2046
+ components,
2047
+ directives,
2048
+ locale: {
2049
+ adapter: createVueI18nAdapter(i18n)
2050
+ }
2051
+ });
2052
+ ```
2053
+
2054
+ Обязательные члены `LocaleInstance`: `name` (по нему адаптер и распознаётся), `current`,
2055
+ `fallback`, `messages`, `decimalSeparator`, `t`, `n` и `provide` — фабрика вложенной локали
2056
+ для `provideLocale`. Если поддержка «локали в поддереве» вам не нужна, `provide` может возвращать
2057
+ тот же инстанс, как в примере выше.
2058
+
2059
+ ## Ключи сообщений
2060
+
2061
+ Встроенный русский словарь — шаблон для перевода на новый язык. Скопируйте его, переведите
2062
+ значения и передайте в `messages` под ключом своего языка; его английская версия доступна как
2063
+ `locales.en`.
2064
+
2065
+ ```ts
2066
+ export default {
2067
+ badge: 'Бейдж',
2068
+ noDataText: 'Отсутствуют данные',
2069
+ selectAll: 'Выбрать все',
2070
+ close: 'Закрыть',
2071
+ open: 'Открыть',
2072
+ dismiss: 'Отклонить',
2073
+ confirmEdit: {
2074
+ ok: 'ОК',
2075
+ cancel: 'Отмена'
2076
+ },
2077
+ carousel: {
2078
+ prev: 'Предыдущий слайд',
2079
+ next: 'Следующий слайд',
2080
+ delimiter: 'Слайд {0} из {1}'
2081
+ },
2082
+ input: {
2083
+ clear: 'Очистить {0}',
2084
+ otp: 'Введите одноразовый код',
2085
+ prependAction: '{0} предварительных действий',
2086
+ appendAction: '{0} добавочных действий'
2087
+ },
2088
+ fileInput: {
2089
+ counter: 'Файлов: {0}',
2090
+ counterSize: 'Файлов: {0} ({1} всего)'
2091
+ },
2092
+ fileUpload: {
2093
+ title: 'Перетащите файлы сюда',
2094
+ divider: 'или',
2095
+ browse: 'Выберите файлы'
2096
+ },
2097
+ steps: {
2098
+ prev: 'Назад',
2099
+ next: 'Далее'
2100
+ },
2101
+ table: {
2102
+ filterTitle: 'Фильтр меню',
2103
+ filterConfirm: 'Выбрать',
2104
+ filterReset: 'Сброс',
2105
+ filterEmptyText: 'Нет фильтров',
2106
+ filterCheckAll: 'Выбрать все элементы',
2107
+ filterSearchPlaceholder: 'Поиск фильтров',
2108
+ emptyText: 'Нет данных',
2109
+ selectAll: 'Выбрать текущую страницу',
2110
+ selectInvert: 'Инвертировать текущую страницу',
2111
+ selectNone: 'Очистить все данные',
2112
+ selectionAll: 'Выбрать все данные',
2113
+ sortTitle: 'Сортировка',
2114
+ expand: 'Раскрыть строку',
2115
+ collapse: 'Свернуть строку',
2116
+ triggerDesc: 'Отсортировать по убыванию',
2117
+ triggerAsc: 'Отсортировать по возрастанию',
2118
+ cancelSort: 'Отменить сортировку',
2119
+ showed: 'Отображено',
2120
+ from: 'из',
2121
+ rowOnPage: 'Строк на странице'
2122
+ },
2123
+ uploader: {
2124
+ uploading: 'Загрузка...',
2125
+ uploadFile: 'Загрузить файл',
2126
+ downloadFile: 'Скачать файл',
2127
+ removeFile: 'Удалить файл',
2128
+ uploadError: 'Ошибка загрузки',
2129
+ previewFile: 'Предпросмотр файла'
2130
+ }
2131
+ };
2132
+ ```
2133
+
2134
+ Словарь можно оставить неполным: недостающие ключи возьмутся из `fallback`, то есть по умолчанию
2135
+ из русского.
2136
+
2137
+ ---
2138
+
1342
2139
  # Темы и глобальные цветовые токены (уровень 2)
1343
2140
 
1344
2141
  > Сгенерировано из `src/themes/*.ts` скриптом `bun run generate:skill`. Не редактировать вручную.
@@ -1837,6 +2634,248 @@ const cds = createCds({ theme: { defaultTheme: 'cdsLight' } });
1837
2634
  | `--cds-color-brand-primary-active` | `#014F77` |
1838
2635
  | `--cds-color-brand-primary` | `#0287CA` |
1839
2636
 
2637
+ ## lumaLight (светлая)
2638
+
2639
+ | Токен | Значение |
2640
+ | --- | --- |
2641
+ | `--cds-color-surface-secondary` | `#ECEEF2` |
2642
+ | `--cds-color-surface-primary` | `#FFFFFF` |
2643
+ | `--cds-color-surface-overlay` | `#272A3080` |
2644
+ | `--cds-color-surface-inverse` | `#404653` |
2645
+ | `--cds-color-surface-elevated` | `#FFFFFF` |
2646
+ | `--cds-color-status-warning-surface` | `#A6840A` |
2647
+ | `--cds-color-status-warning-line` | `#B69210` |
2648
+ | `--cds-color-status-warning-fill-hover` | `#DEC048` |
2649
+ | `--cds-color-status-warning-fill` | `#F2DB82` |
2650
+ | `--cds-color-status-warning-content` | `#584001` |
2651
+ | `--cds-color-status-success-surface` | `#3C9C2C` |
2652
+ | `--cds-color-status-success-line` | `#50A946` |
2653
+ | `--cds-color-status-success-fill-hover` | `#97D283` |
2654
+ | `--cds-color-status-success-fill` | `#BCE8AB` |
2655
+ | `--cds-color-status-success-content` | `#005005` |
2656
+ | `--cds-color-status-progress-surface` | `#198FD8` |
2657
+ | `--cds-color-status-progress-line` | `#2B9DE9` |
2658
+ | `--cds-color-status-progress-fill-hover` | `#90C8FF` |
2659
+ | `--cds-color-status-progress-fill` | `#C3DFFF` |
2660
+ | `--cds-color-status-progress-content` | `#004871` |
2661
+ | `--cds-color-status-info-surface` | `#828A97` |
2662
+ | `--cds-color-status-info-line` | `#9298A4` |
2663
+ | `--cds-color-status-info-fill-hover` | `#C0C3CB` |
2664
+ | `--cds-color-status-info-fill` | `#DADDE2` |
2665
+ | `--cds-color-status-info-content` | `#404653` |
2666
+ | `--cds-color-status-indication-surface` | `#D1453F` |
2667
+ | `--cds-color-status-indication-line` | `#D1453F` |
2668
+ | `--cds-color-status-indication-fill-hover` | `#FFAE9E` |
2669
+ | `--cds-color-status-indication-fill` | `#FFD1C6` |
2670
+ | `--cds-color-status-indication-content` | `#831118` |
2671
+ | `--cds-color-status-danger-surface` | `#D1453F` |
2672
+ | `--cds-color-status-danger-line` | `#D1453F` |
2673
+ | `--cds-color-status-danger-fill-hover` | `#FFAE9E` |
2674
+ | `--cds-color-status-danger-fill` | `#FFD1C6` |
2675
+ | `--cds-color-status-danger-content` | `#831118` |
2676
+ | `--cds-color-page-primary` | `#ECEEF2` |
2677
+ | `--cds-color-other-teal-surface` | `#3A969E` |
2678
+ | `--cds-color-other-teal-line` | `#3CA5AD` |
2679
+ | `--cds-color-other-teal-fill-hover` | `#48D6DB` |
2680
+ | `--cds-color-other-teal-fill` | `#A1E9E9` |
2681
+ | `--cds-color-other-teal-content` | `#022B2F` |
2682
+ | `--cds-color-other-purple-surface` | `#A96FDE` |
2683
+ | `--cds-color-other-purple-line` | `#B381E1` |
2684
+ | `--cds-color-other-purple-fill-hover` | `#D6B8EF` |
2685
+ | `--cds-color-other-purple-fill` | `#E8D5F6` |
2686
+ | `--cds-color-other-purple-content` | `#2F0F50` |
2687
+ | `--cds-color-other-pink-surface` | `#D25CB8` |
2688
+ | `--cds-color-other-pink-line` | `#DB70C4` |
2689
+ | `--cds-color-other-pink-fill-hover` | `#F3ACE7` |
2690
+ | `--cds-color-other-pink-fill` | `#F8D1F2` |
2691
+ | `--cds-color-other-pink-content` | `#420D35` |
2692
+ | `--cds-color-other-lime-surface` | `#78922C` |
2693
+ | `--cds-color-other-lime-line` | `#85A12D` |
2694
+ | `--cds-color-other-lime-fill-hover` | `#B6CC65` |
2695
+ | `--cds-color-other-lime-fill` | `#D4E490` |
2696
+ | `--cds-color-other-lime-content` | `#202901` |
2697
+ | `--cds-color-other-lemon-surface` | `#8E8C23` |
2698
+ | `--cds-color-other-lemon-line` | `#9D9B25` |
2699
+ | `--cds-color-other-lemon-fill-hover` | `#CBC65F` |
2700
+ | `--cds-color-other-lemon-fill` | `#E6DF83` |
2701
+ | `--cds-color-other-lemon-content` | `#282601` |
2702
+ | `--cds-color-other-indigo-surface` | `#807EEC` |
2703
+ | `--cds-color-other-indigo-line` | `#918DEC` |
2704
+ | `--cds-color-other-indigo-fill-hover` | `#C3BDF9` |
2705
+ | `--cds-color-other-indigo-fill` | `#DDD9FC` |
2706
+ | `--cds-color-other-indigo-content` | `#1F1F55` |
2707
+ | `--cds-color-other-cyan-surface` | `#439786` |
2708
+ | `--cds-color-other-cyan-line` | `#48A692` |
2709
+ | `--cds-color-other-cyan-fill-hover` | `#58D8BE` |
2710
+ | `--cds-color-other-cyan-fill` | `#9FEBD8` |
2711
+ | `--cds-color-other-cyan-content` | `#052B24` |
2712
+ | `--cds-color-other-chocolate-surface` | `#AC7F58` |
2713
+ | `--cds-color-other-chocolate-line` | `#B78F6D` |
2714
+ | `--cds-color-other-chocolate-fill-hover` | `#D8BEA9` |
2715
+ | `--cds-color-other-chocolate-fill` | `#E7D9CC` |
2716
+ | `--cds-color-other-chocolate-content` | `#361D01` |
2717
+ | `--cds-color-line-tertiary-hover` | `#AFB3BD` |
2718
+ | `--cds-color-line-tertiary` | `#CCCFD6` |
2719
+ | `--cds-color-line-selected-hover` | `#2978D4` |
2720
+ | `--cds-color-line-selected` | `#4D98F9` |
2721
+ | `--cds-color-line-secondary-hover` | `#9298A4` |
2722
+ | `--cds-color-line-secondary` | `#AFB3BD` |
2723
+ | `--cds-color-line-primary-hover` | `#727987` |
2724
+ | `--cds-color-line-primary` | `#9298A4` |
2725
+ | `--cds-color-line-focus-outline` | `#A4C5FE` |
2726
+ | `--cds-color-line-focus` | `#4D98F9` |
2727
+ | `--cds-color-line-elevated` | `#FFFFFF00` |
2728
+ | `--cds-color-line-disable` | `#C0C3CB` |
2729
+ | `--cds-color-fill-selected-hover` | `#2978D4` |
2730
+ | `--cds-color-fill-selected` | `#4D98F9` |
2731
+ | `--cds-color-fill-secondary-hover` | `#CCCFD6` |
2732
+ | `--cds-color-fill-secondary-active` | `#C0C3CB` |
2733
+ | `--cds-color-fill-secondary` | `#DADDE2` |
2734
+ | `--cds-color-fill-primary-hover` | `#DADDE2` |
2735
+ | `--cds-color-fill-primary-active` | `#CCCFD6` |
2736
+ | `--cds-color-fill-primary` | `#FFFFFF` |
2737
+ | `--cds-color-fill-elevated` | `#FFFFFF` |
2738
+ | `--cds-color-fill-disable` | `#DADDE2` |
2739
+ | `--cds-color-content-tertiary` | `#727987` |
2740
+ | `--cds-color-content-secondary` | `#4F5666` |
2741
+ | `--cds-color-content-primary` | `#212631` |
2742
+ | `--cds-color-content-placeholder` | `#828A97` |
2743
+ | `--cds-color-content-on-dark` | `#FFFFFF` |
2744
+ | `--cds-color-content-link-visited` | `#955EC8` |
2745
+ | `--cds-color-content-link` | `#2978D4` |
2746
+ | `--cds-color-content-inverse` | `#FFFFFF` |
2747
+ | `--cds-color-content-disable` | `#9298A4` |
2748
+ | `--cds-color-brand-secondary-hover` | `#F7CFDA` |
2749
+ | `--cds-color-brand-secondary-border` | `#FBE7EC` |
2750
+ | `--cds-color-brand-secondary-active` | `#F0A8BC` |
2751
+ | `--cds-color-brand-secondary` | `#FBE7EC` |
2752
+ | `--cds-color-brand-primary-hover` | `#D2154B` |
2753
+ | `--cds-color-brand-primary-content` | `#7D0E27` |
2754
+ | `--cds-color-brand-primary-border` | `#C71B3C` |
2755
+ | `--cds-color-brand-primary-active` | `#E0476E` |
2756
+ | `--cds-color-brand-primary` | `#C71B3C` |
2757
+
2758
+ ## lumaDark (тёмная)
2759
+
2760
+ | Токен | Значение |
2761
+ | --- | --- |
2762
+ | `--cds-color-surface-secondary` | `#33373F` |
2763
+ | `--cds-color-surface-primary` | `#272A30` |
2764
+ | `--cds-color-surface-overlay` | `#272A30CC` |
2765
+ | `--cds-color-surface-inverse` | `#DCDDE3` |
2766
+ | `--cds-color-surface-elevated` | `#33373F` |
2767
+ | `--cds-color-status-warning-surface` | `#C9A449` |
2768
+ | `--cds-color-status-warning-line` | `#BE9737` |
2769
+ | `--cds-color-status-warning-fill-hover` | `#8A6502` |
2770
+ | `--cds-color-status-warning-fill` | `#614301` |
2771
+ | `--cds-color-status-warning-content` | `#EADBBA` |
2772
+ | `--cds-color-status-success-surface` | `#6EBA66` |
2773
+ | `--cds-color-status-success-line` | `#5DAF55` |
2774
+ | `--cds-color-status-success-fill-hover` | `#1F7C22` |
2775
+ | `--cds-color-status-success-fill` | `#0D5512` |
2776
+ | `--cds-color-status-success-content` | `#CAE4C4` |
2777
+ | `--cds-color-status-progress-surface` | `#4DB1FF` |
2778
+ | `--cds-color-status-progress-line` | `#0EA4F8` |
2779
+ | `--cds-color-status-progress-fill-hover` | `#0172AC` |
2780
+ | `--cds-color-status-progress-fill` | `#014F77` |
2781
+ | `--cds-color-status-progress-content` | `#C7E0FF` |
2782
+ | `--cds-color-status-info-surface` | `#A5A9B2` |
2783
+ | `--cds-color-status-info-line` | `#989DA8` |
2784
+ | `--cds-color-status-info-fill-hover` | `#666C79` |
2785
+ | `--cds-color-status-info-fill` | `#454951` |
2786
+ | `--cds-color-status-info-content` | `#DCDDE3` |
2787
+ | `--cds-color-status-indication-surface` | `#FF9E92` |
2788
+ | `--cds-color-status-indication-line` | `#FF9E92` |
2789
+ | `--cds-color-status-indication-fill-hover` | `#B8423D` |
2790
+ | `--cds-color-status-indication-fill` | `#822825` |
2791
+ | `--cds-color-status-indication-content` | `#FFD2CC` |
2792
+ | `--cds-color-status-danger-surface` | `#FF9E92` |
2793
+ | `--cds-color-status-danger-line` | `#FF9E92` |
2794
+ | `--cds-color-status-danger-fill-hover` | `#B8423D` |
2795
+ | `--cds-color-status-danger-fill` | `#822825` |
2796
+ | `--cds-color-status-danger-content` | `#FFD2CC` |
2797
+ | `--cds-color-page-primary` | `#1A1A1A` |
2798
+ | `--cds-color-other-teal-surface` | `#0ABACE` |
2799
+ | `--cds-color-other-teal-line` | `#01ACBF` |
2800
+ | `--cds-color-other-teal-fill-hover` | `#007886` |
2801
+ | `--cds-color-other-teal-fill` | `#04525B` |
2802
+ | `--cds-color-other-teal-content` | `#D4F2F7` |
2803
+ | `--cds-color-other-purple-surface` | `#B79AF5` |
2804
+ | `--cds-color-other-purple-line` | `#AE8BEE` |
2805
+ | `--cds-color-other-purple-fill-hover` | `#8457B8` |
2806
+ | `--cds-color-other-purple-fill` | `#5E3882` |
2807
+ | `--cds-color-other-purple-content` | `#F3E9FE` |
2808
+ | `--cds-color-other-pink-surface` | `#E889D1` |
2809
+ | `--cds-color-other-pink-line` | `#E078C7` |
2810
+ | `--cds-color-other-pink-fill-hover` | `#AC4296` |
2811
+ | `--cds-color-other-pink-fill` | `#7A2869` |
2812
+ | `--cds-color-other-pink-content` | `#FDE6F6` |
2813
+ | `--cds-color-other-lime-surface` | `#9BB24D` |
2814
+ | `--cds-color-other-lime-line` | `#8DA63B` |
2815
+ | `--cds-color-other-lime-fill-hover` | `#5B7400` |
2816
+ | `--cds-color-other-lime-fill` | `#3D4F00` |
2817
+ | `--cds-color-other-lime-content` | `#EBEED8` |
2818
+ | `--cds-color-other-lemon-surface` | `#ABAE48` |
2819
+ | `--cds-color-other-lemon-line` | `#9DA235` |
2820
+ | `--cds-color-other-lemon-fill-hover` | `#6A7100` |
2821
+ | `--cds-color-other-lemon-fill` | `#484C01` |
2822
+ | `--cds-color-other-lemon-content` | `#EEEED9` |
2823
+ | `--cds-color-other-indigo-surface` | `#96A4FF` |
2824
+ | `--cds-color-other-indigo-line` | `#8B95F9` |
2825
+ | `--cds-color-other-indigo-fill-hover` | `#6362C5` |
2826
+ | `--cds-color-other-indigo-fill` | `#40428D` |
2827
+ | `--cds-color-other-indigo-content` | `#EBEBFF` |
2828
+ | `--cds-color-other-cyan-surface` | `#0ABEA3` |
2829
+ | `--cds-color-other-cyan-line` | `#0AB098` |
2830
+ | `--cds-color-other-cyan-fill-hover` | `#067A69` |
2831
+ | `--cds-color-other-cyan-fill` | `#005348` |
2832
+ | `--cds-color-other-cyan-content` | `#D5F3EB` |
2833
+ | `--cds-color-other-chocolate-surface` | `#D49E6D` |
2834
+ | `--cds-color-other-chocolate-line` | `#CA915C` |
2835
+ | `--cds-color-other-chocolate-fill-hover` | `#985E1F` |
2836
+ | `--cds-color-other-chocolate-fill` | `#6E3B01` |
2837
+ | `--cds-color-other-chocolate-content` | `#FAEADB` |
2838
+ | `--cds-color-line-tertiary-hover` | `#7A808E` |
2839
+ | `--cds-color-line-tertiary` | `#565D67` |
2840
+ | `--cds-color-line-selected-hover` | `#92BAFE` |
2841
+ | `--cds-color-line-selected` | `#5D9DFC` |
2842
+ | `--cds-color-line-secondary-hover` | `#989DA8` |
2843
+ | `--cds-color-line-secondary` | `#7A808E` |
2844
+ | `--cds-color-line-primary-hover` | `#B5B7C0` |
2845
+ | `--cds-color-line-primary` | `#989DA8` |
2846
+ | `--cds-color-line-focus-outline` | `#1159B5` |
2847
+ | `--cds-color-line-focus` | `#5D9DFC` |
2848
+ | `--cds-color-line-elevated` | `#828A9766` |
2849
+ | `--cds-color-line-disable` | `#666C79` |
2850
+ | `--cds-color-fill-selected-hover` | `#92BAFE` |
2851
+ | `--cds-color-fill-selected` | `#5D9DFC` |
2852
+ | `--cds-color-fill-secondary-hover` | `#565D67` |
2853
+ | `--cds-color-fill-secondary-active` | `#666C79` |
2854
+ | `--cds-color-fill-secondary` | `#454951` |
2855
+ | `--cds-color-fill-primary-hover` | `#454951` |
2856
+ | `--cds-color-fill-primary-active` | `#565D67` |
2857
+ | `--cds-color-fill-primary` | `#272A30` |
2858
+ | `--cds-color-fill-elevated` | `#7A808E` |
2859
+ | `--cds-color-fill-disable` | `#454951` |
2860
+ | `--cds-color-content-tertiary` | `#B5B7C0` |
2861
+ | `--cds-color-content-secondary` | `#CFD2D7` |
2862
+ | `--cds-color-content-primary` | `#ECECEF` |
2863
+ | `--cds-color-content-placeholder` | `#A5A9B2` |
2864
+ | `--cds-color-content-on-dark` | `#F9F9FC` |
2865
+ | `--cds-color-content-link-visited` | `#C0AEF8` |
2866
+ | `--cds-color-content-link` | `#92BAFE` |
2867
+ | `--cds-color-content-inverse` | `#1A1A1A` |
2868
+ | `--cds-color-content-disable` | `#989DA8` |
2869
+ | `--cds-color-brand-secondary-hover` | `#650B25` |
2870
+ | `--cds-color-brand-secondary-border` | `#8A1034` |
2871
+ | `--cds-color-brand-secondary-active` | `#8A1034` |
2872
+ | `--cds-color-brand-secondary` | `#3A0715` |
2873
+ | `--cds-color-brand-primary-hover` | `#8A1034` |
2874
+ | `--cds-color-brand-primary-content` | `#FFD9E1` |
2875
+ | `--cds-color-brand-primary-border` | `#D2154B` |
2876
+ | `--cds-color-brand-primary-active` | `#650B25` |
2877
+ | `--cds-color-brand-primary` | `#D2154B` |
2878
+
1840
2879
  ## promoLight (светлая)
1841
2880
 
1842
2881
  | Токен | Значение |
@@ -22304,6 +23343,517 @@ function onUpdateModelValue(value: boolean, id: number) {
22304
23343
 
22305
23344
  ---
22306
23345
 
23346
+ # CdsOtpInput
23347
+
23348
+ _Категория: Controls · появился в 4.0.0 · статус: new_
23349
+
23350
+ Поле ввода одноразового кода — из SMS, письма или приложения-аутентификатора. Внешне это ряд отдельных ячеек, но ввод принимает один скрытый `input`: поэтому работают автозаполнение кода из SMS, вставка целой строкой из буфера, выделение и стрелки, а фокус не приходится перепрыгивать между ячейками вручную.
23351
+
23352
+ **Смотрите также:** Для обычного короткого текста или числа возьмите CdsTextInput: `CdsOtpInput` нужен там, где длина ввода известна заранее и каждый символ показывается отдельной ячейкой.
23353
+
23354
+ ## Анатомия
23355
+
23356
+ Ячейки (`CdsOtpField`) только рисуют код — введённый символ, заполнитель или
23357
+ мигающую каретку. Настоящий ввод принимает скрытый `input`: он прижат к нижнему
23358
+ краю компонента, поэтому подсказка автозаполнения из SMS появляется под ячейками
23359
+ и ничего не перекрывает. Между ячейками может стоять разделитель
23360
+ (`CdsOtpSeparator`), а в слитном виде ячейки собираются в группу (`CdsOtpGroup`).
23361
+
23362
+ **Пример — `Anatomy.vue`:**
23363
+
23364
+ ```vue
23365
+ <script setup lang="ts">
23366
+ import AnatomyDemo from '@cds/utils/docs/AnatomyDemo.vue';
23367
+ import { CdsOtpInput } from '@central-design-system/components';
23368
+
23369
+ // Схема 1: обычный ряд — ячейки и разделители между ними
23370
+ const fieldsMarkers = [
23371
+ { selector: '.cds-otp-input__content', label: 'Ряд ячеек', side: 'right' as const },
23372
+ { selector: '.cds-otp-field', label: 'Ячейка (CdsOtpField)', side: 'top' as const },
23373
+ { selector: '.cds-otp-separator', label: 'Разделитель (CdsOtpSeparator)', side: 'bottom' as const },
23374
+ { selector: '.cds-otp-field__placeholder', label: 'Символ-заполнитель', side: 'bottom' as const }
23375
+ ];
23376
+
23377
+ // Схема 2: слитный вид — ячейки собраны в общую группу
23378
+ const mergedMarkers = [
23379
+ { selector: '.cds-otp-field', label: 'Ячейка (CdsOtpField)', side: 'top' as const },
23380
+ { selector: '.cds-otp-group', label: 'Группа (CdsOtpGroup)', side: 'bottom' as const }
23381
+ ];
23382
+ </script>
23383
+
23384
+ <template>
23385
+ <div class="flex flex-col gap-600">
23386
+ <AnatomyDemo :markers="fieldsMarkers">
23387
+ <CdsOtpInput model-value="12" divider="-" placeholder="0" />
23388
+ </AnatomyDemo>
23389
+
23390
+ <AnatomyDemo :markers="mergedMarkers">
23391
+ <CdsOtpInput model-value="12" merged />
23392
+ </AnatomyDemo>
23393
+ </div>
23394
+ </template>
23395
+ ```
23396
+
23397
+ ## Вариации
23398
+
23399
+ ### Длина и тип кода
23400
+
23401
+ Свойство `length` задаёт число ячеек, `type` — что можно вводить: `number`
23402
+ (по умолчанию) принимает только цифры и открывает цифровую клавиатуру на
23403
+ мобильных, `text` — любые символы, `password` дополнительно скрывает введённое
23404
+ точками. Тот же эффект без смены типа даёт `masked`.
23405
+
23406
+ **Пример — `LengthAndType.vue`:**
23407
+
23408
+ ```vue
23409
+ <script setup lang="ts">
23410
+ import { CdsOtpInput } from '@central-design-system/components';
23411
+ </script>
23412
+
23413
+ <template>
23414
+ <div class="flex flex-col items-center gap-400">
23415
+ <CdsOtpInput :length="4" model-value="1234" />
23416
+ <CdsOtpInput type="text" model-value="AB12CD" />
23417
+ <CdsOtpInput type="password" model-value="123456" />
23418
+ </div>
23419
+ </template>
23420
+ ```
23421
+
23422
+ ### Допустимые символы
23423
+
23424
+ Свойство `pattern` сужает набор символов: имя готового набора (`numeric`,
23425
+ `alpha`, `alphanumeric`, `unicode-alpha`, `unicode-alphanumeric`) или своё
23426
+ регулярное выражение. Проверка идёт посимвольно — лишние символы не попадут в
23427
+ поле ни с клавиатуры, ни из буфера обмена.
23428
+
23429
+ **Пример — `Pattern.vue`:**
23430
+
23431
+ ```vue
23432
+ <script setup lang="ts">
23433
+ import { CdsOtpInput } from '@central-design-system/components';
23434
+ </script>
23435
+
23436
+ <template>
23437
+ <div class="flex flex-col items-center gap-400">
23438
+ <CdsOtpInput type="text" pattern="alpha" :length="4" placeholder="A" />
23439
+ <CdsOtpInput type="text" pattern="alphanumeric" placeholder="X" />
23440
+ <CdsOtpInput type="text" :pattern="/[0-9A-F]/" placeholder="F" />
23441
+ </div>
23442
+ </template>
23443
+ ```
23444
+
23445
+ ### Разделитель
23446
+
23447
+ Свойство `divider` ставит символ между ячейками — например, дефис в коде вида
23448
+ `123-456`. Слот `divider` даёт полную свободу разметки и получает `index` —
23449
+ номер ячейки слева от разделителя, так что разделитель можно поставить только
23450
+ в нужном месте.
23451
+
23452
+ **Пример — `Divider.vue`:**
23453
+
23454
+ ```vue
23455
+ <script setup lang="ts">
23456
+ import { CdsIcon, CdsOtpInput } from '@central-design-system/components';
23457
+ </script>
23458
+
23459
+ <template>
23460
+ <div class="flex flex-col items-center gap-400">
23461
+ <CdsOtpInput divider="-" model-value="123456" />
23462
+
23463
+ <CdsOtpInput model-value="123456">
23464
+ <template #divider="{ index }">
23465
+ <CdsIcon v-if="index === 2" name="minus" size="sm" />
23466
+ </template>
23467
+ </CdsOtpInput>
23468
+ </div>
23469
+ </template>
23470
+ ```
23471
+
23472
+ ### Слитный вид
23473
+
23474
+ Свойство `merged` убирает промежутки: ячейки становятся одним полем с общей
23475
+ рамкой. Такой вид компактнее и меньше дробит форму.
23476
+
23477
+ **Пример — `Merged.vue`:**
23478
+
23479
+ ```vue
23480
+ <script setup lang="ts">
23481
+ import { CdsOtpInput } from '@central-design-system/components';
23482
+ </script>
23483
+
23484
+ <template>
23485
+ <div class="flex justify-center">
23486
+ <CdsOtpInput merged model-value="1234" />
23487
+ </div>
23488
+ </template>
23489
+ ```
23490
+
23491
+ ### Заполнитель
23492
+
23493
+ Свойство `placeholder` показывает символ в пустых ячейках — подсказку формата
23494
+ или просто точку, чтобы ряд не выглядел пустым.
23495
+
23496
+ **Пример — `Placeholder.vue`:**
23497
+
23498
+ ```vue
23499
+ <script setup lang="ts">
23500
+ import { CdsOtpInput } from '@central-design-system/components';
23501
+ </script>
23502
+
23503
+ <template>
23504
+ <div class="flex flex-col items-center gap-400">
23505
+ <CdsOtpInput placeholder="0" />
23506
+ <CdsOtpInput placeholder="•" />
23507
+ </div>
23508
+ </template>
23509
+ ```
23510
+
23511
+ ### Размеры
23512
+
23513
+ Свойство `size` меняет высоту ячеек и размер шрифта. Размер по умолчанию — `md`.
23514
+
23515
+ **Пример — `Sizes.vue`:**
23516
+
23517
+ ```vue
23518
+ <script setup lang="ts">
23519
+ import { CdsOtpInput } from '@central-design-system/components';
23520
+
23521
+ const sizes = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
23522
+ </script>
23523
+
23524
+ <template>
23525
+ <div class="flex flex-col items-center gap-400">
23526
+ <CdsOtpInput v-for="size of sizes" :key="size" :size="size" :length="4" model-value="1234" />
23527
+ </div>
23528
+ </template>
23529
+ ```
23530
+
23531
+ ### Состояния
23532
+
23533
+ `disabled` блокирует ввод, `error` подсвечивает весь ряд ошибкой, `loading`
23534
+ показывает индикатор поверх ячеек и не стирает набранный код. `focus-all`
23535
+ подсвечивает весь ряд, пока поле в фокусе, а не только активную ячейку.
23536
+
23537
+ **Пример — `States.vue`:**
23538
+
23539
+ ```vue
23540
+ <script setup lang="ts">
23541
+ import { CdsOtpInput } from '@central-design-system/components';
23542
+ </script>
23543
+
23544
+ <template>
23545
+ <div class="flex flex-col items-center gap-400">
23546
+ <CdsOtpInput :length="4" model-value="12" disabled />
23547
+ <CdsOtpInput :length="4" model-value="1234" error />
23548
+ <CdsOtpInput :length="4" model-value="1234" loading />
23549
+ <CdsOtpInput :length="4" model-value="12" focus-all />
23550
+ </div>
23551
+ </template>
23552
+ ```
23553
+
23554
+ ### Слоты
23555
+
23556
+ | Слот | Описание |
23557
+ | :-------- | :---------------------------------------------------------------------------- |
23558
+ | `fields` | Ряд ячеек целиком — своя разметка из `CdsOtpGroup`, `CdsOtpField` и `CdsOtpSeparator` |
23559
+ | `divider` | Разделитель между ячейками, `index` — номер ячейки слева от него |
23560
+ | `loader` | Свой индикатор загрузки (при `loading`) |
23561
+ | `default` | Произвольный контент поверх ячеек |
23562
+
23563
+ Слот `fields` нужен, когда ячейки собираются в группы: каждая `CdsOtpField`
23564
+ получает свой `index`, а `CdsOtpGroup` объединяет соседние ячейки в общую рамку.
23565
+
23566
+ **Пример — `CustomFields.vue`:**
23567
+
23568
+ ```vue
23569
+ <script setup lang="ts">
23570
+ import { CdsOtpField, CdsOtpGroup, CdsOtpInput, CdsOtpSeparator } from '@central-design-system/components';
23571
+ </script>
23572
+
23573
+ <template>
23574
+ <div class="flex justify-center">
23575
+ <CdsOtpInput model-value="123456">
23576
+ <template #fields>
23577
+ <CdsOtpGroup merged>
23578
+ <CdsOtpField v-for="index of [0, 1, 2]" :key="index" :index="index" />
23579
+ </CdsOtpGroup>
23580
+
23581
+ <CdsOtpSeparator>—</CdsOtpSeparator>
23582
+
23583
+ <CdsOtpGroup merged>
23584
+ <CdsOtpField v-for="index of [3, 4, 5]" :key="index" :index="index" />
23585
+ </CdsOtpGroup>
23586
+ </template>
23587
+ </CdsOtpInput>
23588
+ </div>
23589
+ </template>
23590
+ ```
23591
+
23592
+ ## Рекомендации
23593
+
23594
+ | ✅ Хорошо | ❌ Плохо |
23595
+ | --- | --- |
23596
+ | Число ячеек равно длине кода — пользователь сразу видит, сколько символов вводить. | Лишние ячейки заставляют гадать, весь ли код набран. |
23597
+ | Код целиком набирается в одном поле: вставка из буфера и автозаполнение из SMS работают. | Отдельные текстовые поля ломают вставку кода и заставляют вручную перепрыгивать фокус. |
23598
+ | При ошибке поле остаётся доступным, а текст рядом говорит, что делать дальше. | Заблокированное поле без объяснения не даёт исправить код. |
23599
+
23600
+ ## Сценарии использования
23601
+
23602
+ ### Подтверждение по SMS
23603
+
23604
+ Событие `finish` срабатывает, как только код набран целиком, — отправляйте
23605
+ запрос по нему, отдельная кнопка не нужна. На время проверки включите `loading`:
23606
+ код остаётся на экране, а поле не выглядит сломанным. Если сервер не принял код,
23607
+ `error` подсвечивает ряд, а методы `reset()` и `focus()` через ref очищают поле
23608
+ и возвращают в него курсор.
23609
+
23610
+ **Пример — `SmsConfirmation.vue`:**
23611
+
23612
+ ```vue
23613
+ <script setup lang="ts">
23614
+ import { CdsOtpInput } from '@central-design-system/components';
23615
+ import { ref } from 'vue';
23616
+
23617
+ const otpRef = ref<InstanceType<typeof CdsOtpInput>>();
23618
+
23619
+ const code = ref('');
23620
+ const loading = ref(false);
23621
+ const status = ref<'idle' | 'success' | 'error'>('idle');
23622
+
23623
+ // Имитация проверки кода на сервере: верный код — 123456
23624
+ function onFinish(value: string) {
23625
+ loading.value = true;
23626
+ status.value = 'idle';
23627
+
23628
+ setTimeout(() => {
23629
+ loading.value = false;
23630
+ status.value = value === '123456' ? 'success' : 'error';
23631
+
23632
+ if (status.value === 'error') {
23633
+ otpRef.value?.reset();
23634
+ otpRef.value?.focus();
23635
+ }
23636
+ }, 1000);
23637
+ }
23638
+ </script>
23639
+
23640
+ <template>
23641
+ <div class="flex flex-col items-center gap-300">
23642
+ <p class="text-200 text-content-secondary">Код отправлен на +7 999 000-00-00</p>
23643
+
23644
+ <CdsOtpInput
23645
+ ref="otpRef"
23646
+ v-model="code"
23647
+ :loading="loading"
23648
+ :error="status === 'error'"
23649
+ @finish="onFinish"
23650
+ @update:model-value="status = 'idle'"
23651
+ />
23652
+
23653
+ <p v-if="status === 'success'" class="text-200 text-status-success-content">Код подтверждён</p>
23654
+ <p v-else-if="status === 'error'" class="text-200 text-status-danger-content">
23655
+ Код неверный — введите последние цифры из SMS ещё раз
23656
+ </p>
23657
+ <p v-else class="text-200 text-content-tertiary">Введите 123456, чтобы увидеть подтверждение</p>
23658
+ </div>
23659
+ </template>
23660
+ ```
23661
+
23662
+ ### Повторная отправка кода
23663
+
23664
+ Кнопка «Отправить снова» открывается по таймеру — так пользователь не завалит
23665
+ запросами шлюз. Вместе с новым кодом сбрасывайте поле: `reset()` очищает ячейки,
23666
+ `focus()` ставит курсор в первую, и старый код не смешивается с новым.
23667
+
23668
+ **Пример — `ResendCode.vue`:**
23669
+
23670
+ ```vue
23671
+ <script setup lang="ts">
23672
+ import { CdsButton, CdsOtpInput } from '@central-design-system/components';
23673
+ import { onScopeDispose, ref } from 'vue';
23674
+
23675
+ const otpRef = ref<InstanceType<typeof CdsOtpInput>>();
23676
+
23677
+ const code = ref('');
23678
+ const seconds = ref(15);
23679
+
23680
+ let timer: ReturnType<typeof setInterval> | undefined;
23681
+
23682
+ function countdown() {
23683
+ clearInterval(timer);
23684
+
23685
+ timer = setInterval(() => {
23686
+ seconds.value -= 1;
23687
+
23688
+ if (seconds.value <= 0) clearInterval(timer);
23689
+ }, 1000);
23690
+ }
23691
+
23692
+ function resend() {
23693
+ seconds.value = 15;
23694
+ countdown();
23695
+
23696
+ otpRef.value?.reset();
23697
+ otpRef.value?.focus();
23698
+ }
23699
+
23700
+ countdown();
23701
+ onScopeDispose(() => clearInterval(timer));
23702
+ </script>
23703
+
23704
+ <template>
23705
+ <div class="flex flex-col items-center gap-300">
23706
+ <CdsOtpInput ref="otpRef" v-model="code" placeholder="•" />
23707
+
23708
+ <CdsButton
23709
+ appearance="tertiary"
23710
+ size="sm"
23711
+ :disabled="seconds > 0"
23712
+ :text="seconds > 0 ? `Отправить снова через ${seconds} с` : 'Отправить код снова'"
23713
+ @click="resend"
23714
+ />
23715
+ </div>
23716
+ </template>
23717
+ ```
23718
+
23719
+ ### Код в форме
23720
+
23721
+ Когда код — часть формы входа, оставьте кнопку подтверждения: она даёт явный
23722
+ момент отправки. Кнопка ждёт, пока набраны все символы, — длину кода видно из
23723
+ `v-model`, а `disabled` на поле фиксирует уже подтверждённый код.
23724
+
23725
+ **Пример — `TwoFactorForm.vue`:**
23726
+
23727
+ ```vue
23728
+ <script setup lang="ts">
23729
+ import { CdsButton, CdsForm, CdsOtpInput } from '@central-design-system/components';
23730
+ import { computed, ref } from 'vue';
23731
+
23732
+ const code = ref('');
23733
+ const loading = ref(false);
23734
+ const confirmed = ref(false);
23735
+
23736
+ const isComplete = computed(() => code.value.length === 6);
23737
+
23738
+ function submit() {
23739
+ loading.value = true;
23740
+
23741
+ setTimeout(() => {
23742
+ loading.value = false;
23743
+ confirmed.value = true;
23744
+ }, 1000);
23745
+ }
23746
+ </script>
23747
+
23748
+ <template>
23749
+ <CdsForm class="flex flex-col items-center gap-300 w-[350px] m-auto" @submit.prevent="submit">
23750
+ <p class="text-200 text-content-secondary">Введите код из приложения-аутентификатора</p>
23751
+
23752
+ <CdsOtpInput v-model="code" :disabled="confirmed" divider="-" />
23753
+
23754
+ <CdsButton type="submit" text="Подтвердить вход" :disabled="!isComplete || confirmed" :loading="loading" block />
23755
+
23756
+ <p v-if="confirmed" class="text-200 text-status-success-content">Вход подтверждён</p>
23757
+ </CdsForm>
23758
+ </template>
23759
+ ```
23760
+
23761
+ ## API
23762
+
23763
+ ### CdsOtpInput
23764
+
23765
+ **Props**
23766
+
23767
+ | Prop | Type | Default | Required | Description |
23768
+ | --- | --- | --- | --- | --- |
23769
+ | `activeColor` | `string \| undefined` | — | no | Цвет компонента, когда он находится в активном состоянии |
23770
+ | `autofocus` | `boolean \| undefined` | — | no | Включает автофокус |
23771
+ | `baseColor` | `string \| undefined` | — | no | Цвет неактивного компонента |
23772
+ | `bgColor` | `string \| undefined` | — | no | Цвет фона компонента |
23773
+ | `color` | `string \| undefined` | — | no | Цвет компонента |
23774
+ | `disabled` | `boolean \| null \| undefined` | `null` | no | Заблокированное состояние |
23775
+ | `divider` | `string \| undefined` | — | no | Символ-разделитель, который ставится между ячейками кода |
23776
+ | `error` | `boolean \| undefined` | — | no | Состояние ошибки |
23777
+ | `focusAll` | `boolean \| undefined` | — | no | Подсвечивать все ячейки, пока поле находится в фокусе, а не только активную |
23778
+ | `focused` | `boolean \| undefined` | — | no | Управляет состоянием фокуса компонента. Когда `true`, компонент считается сфокусированным и может применять соответствующие стили или поведение. |
23779
+ | `height` | `string \| number \| undefined` | — | no | Высота компонента |
23780
+ | `label` | `string \| undefined` | `'$cds.input.otp'` | no | Доступное имя поля (`aria-label`). Принимает ключ локализации вида `$cds.input.otp` |
23781
+ | `length` | `string \| number \| undefined` | `6` | no | Количество ячеек кода |
23782
+ | `loading` | `string \| boolean \| undefined` | — | no | Индикатор загрузки для компонента |
23783
+ | `masked` | `boolean \| undefined` | — | no | Скрывать введённые символы точками |
23784
+ | `maxHeight` | `string \| number \| undefined` | — | no | Максимальная высота компонента |
23785
+ | `maxWidth` | `string \| number \| undefined` | — | no | Максимальная ширина компонента |
23786
+ | `merged` | `boolean \| undefined` | — | no | Слитный вид: ячейки объединяются в одно поле без промежутков между ними |
23787
+ | `minHeight` | `string \| number \| undefined` | — | no | Минимальная высота компонента |
23788
+ | `minWidth` | `string \| number \| undefined` | — | no | Минимальная ширина компонента |
23789
+ | `modelValue` | `string \| number \| undefined` | — | no | Значение компонента v-model |
23790
+ | `pattern` | `RegExp \| "numeric" \| "alpha" \| "alphanumeric" \| "unicode-alpha" \| "unicode-alphanumeric" \| undefined` | — | no | Допустимые символы: имя готового паттерна (`numeric`, `alpha`, `alphanumeric`, `unicode-alpha`, `unicode-alphanumeric`) или собственное регулярное выражение |
23791
+ | `placeholder` | `string \| undefined` | — | no | Символ-заполнитель, который показывается в пустой ячейке |
23792
+ | `size` | `number \| "xs" \| "sm" \| "md" \| "lg" \| "xl" \| undefined` | `'md'` | no | Размер компонента |
23793
+ | `textColor` | `string \| undefined` | — | no | Цвет текста компонента |
23794
+ | `theme` | `string \| undefined` | — | no | Тема компонента |
23795
+ | `type` | `CdsOtpInputType \| undefined` | `'number'` | no | Тип вводимого кода. `number` ограничивает ввод цифрами, `password` скрывает символы |
23796
+ | `width` | `string \| number \| undefined` | — | no | Ширина компонента |
23797
+
23798
+ **Events**
23799
+
23800
+ | Name | Type | Description |
23801
+ | --- | --- | --- |
23802
+ | `finish` | `[value: string]` | Срабатывает, когда код набран полностью |
23803
+ | `update:focused` | `[focused: boolean]` | Срабатывает при получении или потере фокуса |
23804
+ | `update:modelValue` | `[value: string]` | Срабатывает при изменении значения компонента |
23805
+
23806
+ **Slots**
23807
+
23808
+ | Name | Type | Description |
23809
+ | --- | --- | --- |
23810
+ | `default` | `any` | Произвольный контент поверх ячеек кода |
23811
+ | `divider` | `{ index: number; }` | Разделитель между ячейками. `index` — номер ячейки слева от разделителя |
23812
+ | `fields` | `any` | Полностью заменяет ряд ячеек собственной разметкой из `CdsOtpGroup`, `CdsOtpField` и `CdsOtpSeparator` |
23813
+ | `loader` | `any` | Пользовательский индикатор загрузки |
23814
+
23815
+ **Exposed**
23816
+
23817
+ | Name | Type | Description |
23818
+ | --- | --- | --- |
23819
+ | `blur` | `() => void` | Снять фокус с поля |
23820
+ | `focus` | `() => void` | Установить фокус на поле |
23821
+ | `inputRef` | `HTMLInputElement \| undefined` | Ref-ссылка на скрытый input, который принимает ввод кода |
23822
+ | `isFocused` | `boolean \| undefined` | Состояние фокуса поля |
23823
+ | `reset` | `() => void` | Очистить введённый код |
23824
+
23825
+ ### CdsOtpField
23826
+
23827
+ **Props**
23828
+
23829
+ | Prop | Type | Default | Required | Description |
23830
+ | --- | --- | --- | --- | --- |
23831
+ | `index` | `number` | — | yes | Порядковый номер ячейки, начиная с нуля |
23832
+
23833
+ ### CdsOtpGroup
23834
+
23835
+ **Props**
23836
+
23837
+ | Prop | Type | Default | Required | Description |
23838
+ | --- | --- | --- | --- | --- |
23839
+ | `merged` | `boolean \| null \| undefined` | — | no | Слитный вид группы. По умолчанию наследуется от родительского `CdsOtpInput` |
23840
+
23841
+ **Slots**
23842
+
23843
+ | Name | Type | Description |
23844
+ | --- | --- | --- |
23845
+ | `default` | `any` | Ячейки кода группы |
23846
+
23847
+ ### CdsOtpSeparator
23848
+
23849
+ **Slots**
23850
+
23851
+ | Name | Type | Description |
23852
+ | --- | --- | --- |
23853
+ | `default` | `any` | Содержимое разделителя |
23854
+
23855
+ ---
23856
+
22307
23857
  # CdsOverlay
22308
23858
 
22309
23859
  _Категория: Content · появился в 4.0.0_
@@ -41092,7 +42642,7 @@ function toggle(id: number) {
41092
42642
  Этот документ — **живой** migration guide: записи добавляются по мере появления
41093
42643
  breaking-изменений в alpha/beta релизах CDS 4.
41094
42644
 
41095
- > Версии: CDS 3 — `3.10.1` (стабильная), CDS 4 — `4.0.0-alpha.2` (в разработке).
42645
+ > Версии: CDS 3 — `3.10.1` (стабильная), CDS 4 — `4.0.0-alpha.4` (в разработке).
41096
42646
 
41097
42647
  ## Как читать этот документ
41098
42648