@central-design-system/skills 4.0.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +6 -0
- package/README.md +218 -0
- package/bin/cds-skills.mjs +124 -0
- package/package.json +33 -0
- package/skills/cds-builder/GENERATION.md +44 -0
- package/skills/cds-builder/SKILL.md +308 -0
- package/skills/cds-builder/references/component-decision-tree.md +310 -0
- package/skills/cds-builder/references/components/cds-app/api.md +19 -0
- package/skills/cds-builder/references/components/cds-app/tokens.md +12 -0
- package/skills/cds-builder/references/components/cds-autocomplete/api.md +155 -0
- package/skills/cds-builder/references/components/cds-autocomplete/examples.md +447 -0
- package/skills/cds-builder/references/components/cds-autocomplete/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-autocomplete/tokens.md +19 -0
- package/skills/cds-builder/references/components/cds-avatar/api.md +35 -0
- package/skills/cds-builder/references/components/cds-avatar/examples.md +240 -0
- package/skills/cds-builder/references/components/cds-avatar/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-avatar/tokens.md +32 -0
- package/skills/cds-builder/references/components/cds-badge/api.md +44 -0
- package/skills/cds-builder/references/components/cds-badge/examples.md +332 -0
- package/skills/cds-builder/references/components/cds-badge/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-badge/tokens.md +32 -0
- package/skills/cds-builder/references/components/cds-breadcrumbs/api.md +83 -0
- package/skills/cds-builder/references/components/cds-breadcrumbs/examples.md +219 -0
- package/skills/cds-builder/references/components/cds-breadcrumbs/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-breadcrumbs/tokens.md +24 -0
- package/skills/cds-builder/references/components/cds-button/api.md +66 -0
- package/skills/cds-builder/references/components/cds-button/examples.md +324 -0
- package/skills/cds-builder/references/components/cds-button/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-button/tokens.md +190 -0
- package/skills/cds-builder/references/components/cds-button-group/api.md +27 -0
- package/skills/cds-builder/references/components/cds-button-group/examples.md +33 -0
- package/skills/cds-builder/references/components/cds-button-group/tokens.md +17 -0
- package/skills/cds-builder/references/components/cds-button-toggle/api.md +51 -0
- package/skills/cds-builder/references/components/cds-button-toggle/examples.md +278 -0
- package/skills/cds-builder/references/components/cds-button-toggle/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-button-toggle/tokens.md +13 -0
- package/skills/cds-builder/references/components/cds-card/api.md +221 -0
- package/skills/cds-builder/references/components/cds-card/examples.md +652 -0
- package/skills/cds-builder/references/components/cds-card/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-card/tokens.md +46 -0
- package/skills/cds-builder/references/components/cds-carousel/api.md +107 -0
- package/skills/cds-builder/references/components/cds-carousel/examples.md +444 -0
- package/skills/cds-builder/references/components/cds-carousel/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-carousel/tokens.md +17 -0
- package/skills/cds-builder/references/components/cds-checkbox/api.md +93 -0
- package/skills/cds-builder/references/components/cds-checkbox/examples.md +319 -0
- package/skills/cds-builder/references/components/cds-checkbox/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-checkbox/tokens.md +18 -0
- package/skills/cds-builder/references/components/cds-checkbox-button/api.md +56 -0
- package/skills/cds-builder/references/components/cds-checkbox-button/examples.md +29 -0
- package/skills/cds-builder/references/components/cds-checkbox-button/tokens.md +56 -0
- package/skills/cds-builder/references/components/cds-combobox/api.md +158 -0
- package/skills/cds-builder/references/components/cds-combobox/examples.md +264 -0
- package/skills/cds-builder/references/components/cds-combobox/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-combobox/tokens.md +19 -0
- package/skills/cds-builder/references/components/cds-counter/api.md +24 -0
- package/skills/cds-builder/references/components/cds-counter/examples.md +93 -0
- package/skills/cds-builder/references/components/cds-counter/tokens.md +11 -0
- package/skills/cds-builder/references/components/cds-date-input/api.md +151 -0
- package/skills/cds-builder/references/components/cds-date-input/examples.md +479 -0
- package/skills/cds-builder/references/components/cds-date-input/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-date-input/tokens.md +16 -0
- package/skills/cds-builder/references/components/cds-date-picker/api.md +63 -0
- package/skills/cds-builder/references/components/cds-date-picker/examples.md +394 -0
- package/skills/cds-builder/references/components/cds-date-picker/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-date-picker/tokens.md +66 -0
- package/skills/cds-builder/references/components/cds-defaults-provider/api.md +21 -0
- package/skills/cds-builder/references/components/cds-description/api.md +22 -0
- package/skills/cds-builder/references/components/cds-description/examples.md +69 -0
- package/skills/cds-builder/references/components/cds-description/tokens.md +11 -0
- package/skills/cds-builder/references/components/cds-divider/api.md +29 -0
- package/skills/cds-builder/references/components/cds-divider/examples.md +374 -0
- package/skills/cds-builder/references/components/cds-divider/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-divider/tokens.md +38 -0
- package/skills/cds-builder/references/components/cds-drawer/api.md +53 -0
- package/skills/cds-builder/references/components/cds-drawer/examples.md +432 -0
- package/skills/cds-builder/references/components/cds-drawer/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-drawer/tokens.md +27 -0
- package/skills/cds-builder/references/components/cds-empty-state/api.md +55 -0
- package/skills/cds-builder/references/components/cds-empty-state/examples.md +330 -0
- package/skills/cds-builder/references/components/cds-empty-state/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-empty-state/tokens.md +25 -0
- package/skills/cds-builder/references/components/cds-expandable-panel/api.md +157 -0
- package/skills/cds-builder/references/components/cds-expandable-panel/examples.md +569 -0
- package/skills/cds-builder/references/components/cds-expandable-panel/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-expandable-panel/tokens.md +34 -0
- package/skills/cds-builder/references/components/cds-field/api.md +62 -0
- package/skills/cds-builder/references/components/cds-field/examples.md +202 -0
- package/skills/cds-builder/references/components/cds-field/tokens.md +94 -0
- package/skills/cds-builder/references/components/cds-file-input/api.md +109 -0
- package/skills/cds-builder/references/components/cds-file-input/examples.md +368 -0
- package/skills/cds-builder/references/components/cds-file-input/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-file-input/tokens.md +15 -0
- package/skills/cds-builder/references/components/cds-file-upload/api.md +296 -0
- package/skills/cds-builder/references/components/cds-file-upload/examples.md +411 -0
- package/skills/cds-builder/references/components/cds-file-upload/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-file-upload/tokens.md +50 -0
- package/skills/cds-builder/references/components/cds-footer/api.md +35 -0
- package/skills/cds-builder/references/components/cds-footer/examples.md +219 -0
- package/skills/cds-builder/references/components/cds-footer/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-footer/tokens.md +14 -0
- package/skills/cds-builder/references/components/cds-form/api.md +48 -0
- package/skills/cds-builder/references/components/cds-form/examples.md +552 -0
- package/skills/cds-builder/references/components/cds-form/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-form/tokens.md +15 -0
- package/skills/cds-builder/references/components/cds-functional-button/api.md +34 -0
- package/skills/cds-builder/references/components/cds-functional-button/examples.md +254 -0
- package/skills/cds-builder/references/components/cds-functional-button/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-functional-button/tokens.md +35 -0
- package/skills/cds-builder/references/components/cds-grid/api.md +66 -0
- package/skills/cds-builder/references/components/cds-grid/examples.md +687 -0
- package/skills/cds-builder/references/components/cds-grid/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-header/api.md +35 -0
- package/skills/cds-builder/references/components/cds-header/examples.md +345 -0
- package/skills/cds-builder/references/components/cds-header/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-header/tokens.md +13 -0
- package/skills/cds-builder/references/components/cds-highlight/api.md +22 -0
- package/skills/cds-builder/references/components/cds-highlight/examples.md +313 -0
- package/skills/cds-builder/references/components/cds-highlight/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-highlight/tokens.md +18 -0
- package/skills/cds-builder/references/components/cds-icon/api.md +33 -0
- package/skills/cds-builder/references/components/cds-icon/examples.md +272 -0
- package/skills/cds-builder/references/components/cds-icon/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-icon/tokens.md +30 -0
- package/skills/cds-builder/references/components/cds-image/api.md +67 -0
- package/skills/cds-builder/references/components/cds-image/examples.md +437 -0
- package/skills/cds-builder/references/components/cds-image/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-image/tokens.md +14 -0
- package/skills/cds-builder/references/components/cds-input/api.md +80 -0
- package/skills/cds-builder/references/components/cds-input/examples.md +205 -0
- package/skills/cds-builder/references/components/cds-input/tokens.md +108 -0
- package/skills/cds-builder/references/components/cds-label/api.md +25 -0
- package/skills/cds-builder/references/components/cds-label/examples.md +72 -0
- package/skills/cds-builder/references/components/cds-label/tokens.md +12 -0
- package/skills/cds-builder/references/components/cds-layout/api.md +50 -0
- package/skills/cds-builder/references/components/cds-layout/examples.md +431 -0
- package/skills/cds-builder/references/components/cds-layout/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-layout/tokens.md +12 -0
- package/skills/cds-builder/references/components/cds-link/api.md +33 -0
- package/skills/cds-builder/references/components/cds-link/examples.md +195 -0
- package/skills/cds-builder/references/components/cds-link/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-link/tokens.md +16 -0
- package/skills/cds-builder/references/components/cds-list/api.md +329 -0
- package/skills/cds-builder/references/components/cds-list/examples.md +653 -0
- package/skills/cds-builder/references/components/cds-list/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-list/tokens.md +125 -0
- package/skills/cds-builder/references/components/cds-loader/api.md +18 -0
- package/skills/cds-builder/references/components/cds-loader/examples.md +59 -0
- package/skills/cds-builder/references/components/cds-loader/tokens.md +50 -0
- package/skills/cds-builder/references/components/cds-main/api.md +14 -0
- package/skills/cds-builder/references/components/cds-main/examples.md +60 -0
- package/skills/cds-builder/references/components/cds-menu/api.md +84 -0
- package/skills/cds-builder/references/components/cds-menu/examples.md +595 -0
- package/skills/cds-builder/references/components/cds-menu/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-menu/tokens.md +19 -0
- package/skills/cds-builder/references/components/cds-messages/api.md +29 -0
- package/skills/cds-builder/references/components/cds-messages/examples.md +119 -0
- package/skills/cds-builder/references/components/cds-messages/tokens.md +15 -0
- package/skills/cds-builder/references/components/cds-modal/api.md +86 -0
- package/skills/cds-builder/references/components/cds-modal/examples.md +516 -0
- package/skills/cds-builder/references/components/cds-modal/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-modal/tokens.md +22 -0
- package/skills/cds-builder/references/components/cds-notification/api.md +46 -0
- package/skills/cds-builder/references/components/cds-notification/examples.md +314 -0
- package/skills/cds-builder/references/components/cds-notification/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-notification/tokens.md +23 -0
- package/skills/cds-builder/references/components/cds-notification-alert/api.md +93 -0
- package/skills/cds-builder/references/components/cds-notification-alert/examples.md +202 -0
- package/skills/cds-builder/references/components/cds-notification-alert/tokens.md +15 -0
- package/skills/cds-builder/references/components/cds-otp-input/api.md +106 -0
- package/skills/cds-builder/references/components/cds-otp-input/examples.md +329 -0
- package/skills/cds-builder/references/components/cds-otp-input/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-otp-input/tokens.md +41 -0
- package/skills/cds-builder/references/components/cds-overlay/api.md +85 -0
- package/skills/cds-builder/references/components/cds-overlay/examples.md +409 -0
- package/skills/cds-builder/references/components/cds-overlay/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-overlay/tokens.md +12 -0
- package/skills/cds-builder/references/components/cds-page/api.md +21 -0
- package/skills/cds-builder/references/components/cds-page/examples.md +123 -0
- package/skills/cds-builder/references/components/cds-pagination/api.md +67 -0
- package/skills/cds-builder/references/components/cds-pagination/examples.md +320 -0
- package/skills/cds-builder/references/components/cds-pagination/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-pagination/tokens.md +20 -0
- package/skills/cds-builder/references/components/cds-progress-bar/api.md +53 -0
- package/skills/cds-builder/references/components/cds-progress-bar/examples.md +393 -0
- package/skills/cds-builder/references/components/cds-progress-bar/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-progress-bar/tokens.md +33 -0
- package/skills/cds-builder/references/components/cds-progress-circle/api.md +30 -0
- package/skills/cds-builder/references/components/cds-progress-circle/examples.md +326 -0
- package/skills/cds-builder/references/components/cds-progress-circle/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-progress-circle/tokens.md +31 -0
- package/skills/cds-builder/references/components/cds-radio/api.md +47 -0
- package/skills/cds-builder/references/components/cds-radio/tokens.md +36 -0
- package/skills/cds-builder/references/components/cds-radio-group/api.md +87 -0
- package/skills/cds-builder/references/components/cds-radio-group/examples.md +320 -0
- package/skills/cds-builder/references/components/cds-radio-group/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-radio-group/tokens.md +14 -0
- package/skills/cds-builder/references/components/cds-responsive/api.md +29 -0
- package/skills/cds-builder/references/components/cds-responsive/examples.md +271 -0
- package/skills/cds-builder/references/components/cds-responsive/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-responsive/tokens.md +13 -0
- package/skills/cds-builder/references/components/cds-select/api.md +155 -0
- package/skills/cds-builder/references/components/cds-select/examples.md +794 -0
- package/skills/cds-builder/references/components/cds-select/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-select/tokens.md +17 -0
- package/skills/cds-builder/references/components/cds-selection-control/api.md +60 -0
- package/skills/cds-builder/references/components/cds-selection-control/examples.md +468 -0
- package/skills/cds-builder/references/components/cds-selection-control-group/api.md +45 -0
- package/skills/cds-builder/references/components/cds-selection-control-group/examples.md +349 -0
- package/skills/cds-builder/references/components/cds-skeleton-loader/api.md +30 -0
- package/skills/cds-builder/references/components/cds-skeleton-loader/examples.md +297 -0
- package/skills/cds-builder/references/components/cds-skeleton-loader/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-skeleton-loader/tokens.md +62 -0
- package/skills/cds-builder/references/components/cds-slide-group/api.md +76 -0
- package/skills/cds-builder/references/components/cds-slide-group/examples.md +304 -0
- package/skills/cds-builder/references/components/cds-slide-group/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-slide-group/tokens.md +11 -0
- package/skills/cds-builder/references/components/cds-slide-view/api.md +88 -0
- package/skills/cds-builder/references/components/cds-slide-view/examples.md +311 -0
- package/skills/cds-builder/references/components/cds-slide-view/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-slide-view/tokens.md +14 -0
- package/skills/cds-builder/references/components/cds-stages/api.md +31 -0
- package/skills/cds-builder/references/components/cds-stages/examples.md +230 -0
- package/skills/cds-builder/references/components/cds-stages/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-stages/tokens.md +27 -0
- package/skills/cds-builder/references/components/cds-status/api.md +24 -0
- package/skills/cds-builder/references/components/cds-status/examples.md +170 -0
- package/skills/cds-builder/references/components/cds-status/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-status/tokens.md +17 -0
- package/skills/cds-builder/references/components/cds-steps/api.md +176 -0
- package/skills/cds-builder/references/components/cds-steps/examples.md +320 -0
- package/skills/cds-builder/references/components/cds-steps/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-steps/tokens.md +52 -0
- package/skills/cds-builder/references/components/cds-surface/api.md +30 -0
- package/skills/cds-builder/references/components/cds-surface/examples.md +106 -0
- package/skills/cds-builder/references/components/cds-table/api.md +120 -0
- package/skills/cds-builder/references/components/cds-table/examples.md +3049 -0
- package/skills/cds-builder/references/components/cds-table/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-table/tokens.md +92 -0
- package/skills/cds-builder/references/components/cds-tabs/api.md +179 -0
- package/skills/cds-builder/references/components/cds-tabs/examples.md +610 -0
- package/skills/cds-builder/references/components/cds-tabs/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-tabs/tokens.md +40 -0
- package/skills/cds-builder/references/components/cds-tag/api.md +64 -0
- package/skills/cds-builder/references/components/cds-tag/examples.md +278 -0
- package/skills/cds-builder/references/components/cds-tag/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-tag/tokens.md +67 -0
- package/skills/cds-builder/references/components/cds-tag-group/api.md +58 -0
- package/skills/cds-builder/references/components/cds-tag-group/examples.md +346 -0
- package/skills/cds-builder/references/components/cds-tag-group/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-tag-group/tokens.md +18 -0
- package/skills/cds-builder/references/components/cds-text-area/api.md +113 -0
- package/skills/cds-builder/references/components/cds-text-area/examples.md +327 -0
- package/skills/cds-builder/references/components/cds-text-area/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-text-area/tokens.md +16 -0
- package/skills/cds-builder/references/components/cds-text-input/api.md +115 -0
- package/skills/cds-builder/references/components/cds-text-input/examples.md +546 -0
- package/skills/cds-builder/references/components/cds-text-input/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-text-input/tokens.md +17 -0
- package/skills/cds-builder/references/components/cds-time-picker/api.md +44 -0
- package/skills/cds-builder/references/components/cds-time-picker/examples.md +407 -0
- package/skills/cds-builder/references/components/cds-time-picker/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-time-picker/tokens.md +23 -0
- package/skills/cds-builder/references/components/cds-toast/api.md +97 -0
- package/skills/cds-builder/references/components/cds-toast/examples.md +296 -0
- package/skills/cds-builder/references/components/cds-toast/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-toast/tokens.md +26 -0
- package/skills/cds-builder/references/components/cds-toast-queue/api.md +86 -0
- package/skills/cds-builder/references/components/cds-toast-queue/examples.md +227 -0
- package/skills/cds-builder/references/components/cds-toggle/api.md +97 -0
- package/skills/cds-builder/references/components/cds-toggle/examples.md +335 -0
- package/skills/cds-builder/references/components/cds-toggle/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-toggle/tokens.md +91 -0
- package/skills/cds-builder/references/components/cds-toolbar/api.md +44 -0
- package/skills/cds-builder/references/components/cds-toolbar/examples.md +186 -0
- package/skills/cds-builder/references/components/cds-toolbar/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-toolbar/tokens.md +13 -0
- package/skills/cds-builder/references/components/cds-tooltip/api.md +83 -0
- package/skills/cds-builder/references/components/cds-tooltip/examples.md +321 -0
- package/skills/cds-builder/references/components/cds-tooltip/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-tooltip/tokens.md +25 -0
- package/skills/cds-builder/references/components/cds-tree/api.md +169 -0
- package/skills/cds-builder/references/components/cds-tree/examples.md +785 -0
- package/skills/cds-builder/references/components/cds-tree/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-tree/tokens.md +39 -0
- package/skills/cds-builder/references/components/cds-uploader/api.md +105 -0
- package/skills/cds-builder/references/components/cds-uploader/examples.md +553 -0
- package/skills/cds-builder/references/components/cds-uploader/guidelines.md +10 -0
- package/skills/cds-builder/references/components/cds-uploader/tokens.md +26 -0
- package/skills/cds-builder/references/components/cds-virtual-scroll/api.md +60 -0
- package/skills/cds-builder/references/components/cds-virtual-scroll/examples.md +272 -0
- package/skills/cds-builder/references/components/cds-virtual-scroll/guidelines.md +9 -0
- package/skills/cds-builder/references/components/cds-virtual-scroll/tokens.md +13 -0
- package/skills/cds-builder/references/guides/conventions.md +48 -0
- package/skills/cds-builder/references/guides/date-utils.md +301 -0
- package/skills/cds-builder/references/guides/display-and-platform.md +263 -0
- package/skills/cds-builder/references/guides/forms.md +77 -0
- package/skills/cds-builder/references/guides/global-configuration.md +354 -0
- package/skills/cds-builder/references/guides/icons.md +172 -0
- package/skills/cds-builder/references/guides/internationalization.md +470 -0
- package/skills/cds-builder/references/guides/migration-cds3-to-cds4.md +49 -0
- package/skills/cds-builder/references/guides/sass-variables.md +238 -0
- package/skills/cds-builder/references/guides/setup.md +81 -0
- package/skills/cds-builder/references/guides/tailwindcss.md +93 -0
- package/skills/cds-builder/references/guides/theme.md +343 -0
- package/skills/cds-builder/references/guides/treeshaking.md +237 -0
- package/skills/cds-builder/references/patterns/dialogs.md +89 -0
- package/skills/cds-builder/references/patterns/forms.md +101 -0
- package/skills/cds-builder/references/patterns/page-layout.md +78 -0
- package/skills/cds-builder/references/patterns/tables.md +87 -0
- package/skills/cds-builder/references/tokens/colors.md +507 -0
- package/skills/cds-builder/references/tokens/themes.md +981 -0
- package/skills/cds-builder/scripts/check-contracts.mjs +264 -0
- package/skills/cds-migrate/GENERATION.md +44 -0
- package/skills/cds-migrate/SKILL.md +160 -0
- package/skills/cds-migrate/references/migration-full.md +2225 -0
- package/skills/cds-refactor/GENERATION.md +44 -0
- package/skills/cds-refactor/SKILL.md +187 -0
- package/skills/cds-refactor/references/html-to-cds.md +80 -0
- package/skills/cds-refactor/references/review-checklist.md +73 -0
- package/skills/cds-refactor/references/tailwind-to-cds.md +65 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# CdsVirtualScroll — usage examples
|
|
2
|
+
|
|
3
|
+
> Extracted from Storybook stories (`docs/*.stories.ts`) by `bun run generate:skill`. Do not edit manually.
|
|
4
|
+
> The full component contract is in [api.md](api.md). `v-bind="args"` in templates refers to the props from the **Args** block of the corresponding example.
|
|
5
|
+
|
|
6
|
+
Virtual scrolling keeps long lists fast: only the visible rows get into the DOM, not the whole array. Pass the records to `items`, the markup of a row to the slot, and a list of tens of thousands of positions scrolls as smoothly as a list of ten.
|
|
7
|
+
|
|
8
|
+
## Fixed height
|
|
9
|
+
|
|
10
|
+
The `height` prop sets the height of the viewport — the scrolling happens inside it. If all the rows have the same height, set `item-height`: the component will not measure every row, and the positions and the scrollbar will be exact from the very first render.
|
|
11
|
+
|
|
12
|
+
**Example (SFC):**
|
|
13
|
+
|
|
14
|
+
```vue
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
import { CdsCard, CdsList, CdsListItem, CdsVirtualScroll } from '@central-design-system/components';
|
|
17
|
+
|
|
18
|
+
const items = Array.from({ length: 10000 }, (_, index) => ({
|
|
19
|
+
title: `Позиция каталога №${index + 1}`
|
|
20
|
+
}));
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<template>
|
|
24
|
+
<CdsCard class="m-auto w-[320px]">
|
|
25
|
+
<CdsList>
|
|
26
|
+
<CdsVirtualScroll height="300" item-height="36" :items="items">
|
|
27
|
+
<template #default="{ item, index }">
|
|
28
|
+
<CdsListItem
|
|
29
|
+
:base-color="index % 2 ? 'surface-primary' : 'surface-secondary'"
|
|
30
|
+
:height="36"
|
|
31
|
+
:title="item.title"
|
|
32
|
+
/>
|
|
33
|
+
</template>
|
|
34
|
+
</CdsVirtualScroll>
|
|
35
|
+
</CdsList>
|
|
36
|
+
</CdsCard>
|
|
37
|
+
</template>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Dynamic height
|
|
41
|
+
|
|
42
|
+
Without `item-height` the component measures the rows automatically — this fits content of variable length: comments, messages, descriptions. The heights get refined as you scroll, so the scrollbar may shift slightly.
|
|
43
|
+
|
|
44
|
+
**Example (SFC):**
|
|
45
|
+
|
|
46
|
+
```vue
|
|
47
|
+
<script setup lang="ts">
|
|
48
|
+
import { CdsCard, CdsVirtualScroll } from '@central-design-system/components';
|
|
49
|
+
|
|
50
|
+
const texts = [
|
|
51
|
+
'Согласовано.',
|
|
52
|
+
'Уточните, пожалуйста, сроки поставки: в прошлой заявке отгрузка задержалась на неделю.',
|
|
53
|
+
'Прошу приложить спецификацию к позиции.',
|
|
54
|
+
'Цена выше средней по рынку — запросите у поставщика пересчёт и добавьте обоснование к заявке, иначе финансовый отдел вернёт её на доработку.'
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
const items = Array.from({ length: 5000 }, (_, index) => ({
|
|
58
|
+
id: index + 1,
|
|
59
|
+
author: `Участник ${(index % 27) + 1}`,
|
|
60
|
+
text: texts[index % texts.length]
|
|
61
|
+
}));
|
|
62
|
+
</script>
|
|
63
|
+
|
|
64
|
+
<template>
|
|
65
|
+
<CdsCard class="m-auto w-[360px]">
|
|
66
|
+
<CdsVirtualScroll height="300" item-key="id" :items="items">
|
|
67
|
+
<template #default="{ item }">
|
|
68
|
+
<div class="border-b border-line-primary p-2">
|
|
69
|
+
<div class="text-100 text-content-secondary">{{ item.author }}</div>
|
|
70
|
+
<div class="text-200">{{ item.text }}</div>
|
|
71
|
+
</div>
|
|
72
|
+
</template>
|
|
73
|
+
</CdsVirtualScroll>
|
|
74
|
+
</CdsCard>
|
|
75
|
+
</template>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Renderless mode
|
|
79
|
+
|
|
80
|
+
The `renderless` prop removes the own scroll container: the component listens to the scrolling of the nearest scrollable parent and renders the rows without wrappers. The slot additionally receives `itemRef` — bind it to the root node of the row so that the component knows its height. This is how the list fits into an existing scroll — of a panel or of the whole page. Give the scrollable parent `position: relative` — the component counts the row positions from it.
|
|
81
|
+
|
|
82
|
+
**Example (SFC):**
|
|
83
|
+
|
|
84
|
+
```vue
|
|
85
|
+
<script setup lang="ts">
|
|
86
|
+
import { CdsVirtualScroll } from '@central-design-system/components';
|
|
87
|
+
|
|
88
|
+
const items = Array.from({ length: 3000 }, (_, index) => `Строка отчёта №${index + 1}`);
|
|
89
|
+
</script>
|
|
90
|
+
|
|
91
|
+
<template>
|
|
92
|
+
<div class="relative m-auto h-[300px] w-[360px] overflow-y-auto rounded-200 border border-line-primary p-2">
|
|
93
|
+
<div class="text-300">Отчёт за квартал</div>
|
|
94
|
+
<p class="text-100 text-content-secondary">
|
|
95
|
+
Шапка — часть общего потока: скролл-контейнер здесь один, родительский, и заголовок прокручивается вместе со
|
|
96
|
+
строками списка.
|
|
97
|
+
</p>
|
|
98
|
+
|
|
99
|
+
<CdsVirtualScroll renderless :items="items">
|
|
100
|
+
<template #default="{ item, itemRef }">
|
|
101
|
+
<div :ref="itemRef" class="py-1">{{ item }}</div>
|
|
102
|
+
</template>
|
|
103
|
+
</CdsVirtualScroll>
|
|
104
|
+
</div>
|
|
105
|
+
</template>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Catalog search
|
|
109
|
+
|
|
110
|
+
Pass an already filtered array to `items`: a `computed` recalculates the records on input, and the component picks the new list up on its own. `item-key="id"` binds the rows to the records rather than to the positions in the array — so the rows do not get mixed up while filtering.
|
|
111
|
+
|
|
112
|
+
**Example (SFC):**
|
|
113
|
+
|
|
114
|
+
```vue
|
|
115
|
+
<script setup lang="ts">
|
|
116
|
+
import { CdsCard, CdsList, CdsListItem, CdsTextInput, CdsVirtualScroll } from '@central-design-system/components';
|
|
117
|
+
import { computed, ref } from 'vue';
|
|
118
|
+
|
|
119
|
+
const query = ref('');
|
|
120
|
+
|
|
121
|
+
const categories = ['Крепёж', 'Инструмент', 'Электрика', 'Сантехника', 'Спецодежда'];
|
|
122
|
+
|
|
123
|
+
const items = Array.from({ length: 10000 }, (_, index) => ({
|
|
124
|
+
id: index + 1,
|
|
125
|
+
title: `${categories[index % categories.length]}, артикул ${10000 + index}`
|
|
126
|
+
}));
|
|
127
|
+
|
|
128
|
+
const filtered = computed(() => {
|
|
129
|
+
const search = query.value.trim().toLowerCase();
|
|
130
|
+
|
|
131
|
+
return search ? items.filter((item) => item.title.toLowerCase().includes(search)) : items;
|
|
132
|
+
});
|
|
133
|
+
</script>
|
|
134
|
+
|
|
135
|
+
<template>
|
|
136
|
+
<div class="m-auto flex w-[360px] flex-col gap-2">
|
|
137
|
+
<CdsTextInput v-model="query" clearable hide-details placeholder="Поиск по каталогу" prepend-inner-icon="search" />
|
|
138
|
+
|
|
139
|
+
<CdsCard>
|
|
140
|
+
<CdsList v-if="filtered.length">
|
|
141
|
+
<CdsVirtualScroll height="260" item-height="36" item-key="id" :items="filtered">
|
|
142
|
+
<template #default="{ item }">
|
|
143
|
+
<CdsListItem :height="36" :title="item.title" />
|
|
144
|
+
</template>
|
|
145
|
+
</CdsVirtualScroll>
|
|
146
|
+
</CdsList>
|
|
147
|
+
<div v-else class="p-2 text-content-secondary">Ничего не найдено</div>
|
|
148
|
+
</CdsCard>
|
|
149
|
+
|
|
150
|
+
<div class="text-100 text-content-secondary">Найдено: {{ filtered.length.toLocaleString('ru-RU') }}</div>
|
|
151
|
+
</div>
|
|
152
|
+
</template>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Jumping through a journal
|
|
156
|
+
|
|
157
|
+
The component exposes the `scrollToIndex` method — get it through a ref and scroll the list programmatically. The month buttons calculate the index of the first operation of the month; with a fixed `item-height` the jump lands exactly on the right row.
|
|
158
|
+
|
|
159
|
+
**Example (SFC):**
|
|
160
|
+
|
|
161
|
+
```vue
|
|
162
|
+
<script setup lang="ts">
|
|
163
|
+
import { CdsButton, CdsCard, CdsList, CdsListItem, CdsVirtualScroll } from '@central-design-system/components';
|
|
164
|
+
import { ref } from 'vue';
|
|
165
|
+
|
|
166
|
+
const MONTHS = [
|
|
167
|
+
'Январь',
|
|
168
|
+
'Февраль',
|
|
169
|
+
'Март',
|
|
170
|
+
'Апрель',
|
|
171
|
+
'Май',
|
|
172
|
+
'Июнь',
|
|
173
|
+
'Июль',
|
|
174
|
+
'Август',
|
|
175
|
+
'Сентябрь',
|
|
176
|
+
'Октябрь',
|
|
177
|
+
'Ноябрь',
|
|
178
|
+
'Декабрь'
|
|
179
|
+
];
|
|
180
|
+
const PER_MONTH = 400;
|
|
181
|
+
|
|
182
|
+
const items = Array.from({ length: MONTHS.length * PER_MONTH }, (_, index) => ({
|
|
183
|
+
id: index + 1,
|
|
184
|
+
title: `${MONTHS[Math.floor(index / PER_MONTH)]} — операция №${index + 1}`
|
|
185
|
+
}));
|
|
186
|
+
|
|
187
|
+
const virtualScroll = ref<InstanceType<typeof CdsVirtualScroll>>();
|
|
188
|
+
|
|
189
|
+
function scrollToMonth(month: number) {
|
|
190
|
+
virtualScroll.value?.scrollToIndex(month * PER_MONTH);
|
|
191
|
+
}
|
|
192
|
+
</script>
|
|
193
|
+
|
|
194
|
+
<template>
|
|
195
|
+
<div class="m-auto flex w-[400px] flex-col gap-2">
|
|
196
|
+
<div class="flex flex-wrap justify-center gap-1">
|
|
197
|
+
<CdsButton
|
|
198
|
+
v-for="(month, index) in MONTHS"
|
|
199
|
+
:key="month"
|
|
200
|
+
appearance="tertiary"
|
|
201
|
+
size="xs"
|
|
202
|
+
@click="scrollToMonth(index)"
|
|
203
|
+
>
|
|
204
|
+
{{ month.slice(0, 3) }}
|
|
205
|
+
</CdsButton>
|
|
206
|
+
</div>
|
|
207
|
+
|
|
208
|
+
<CdsCard>
|
|
209
|
+
<CdsList>
|
|
210
|
+
<CdsVirtualScroll ref="virtualScroll" height="260" item-height="36" item-key="id" :items="items">
|
|
211
|
+
<template #default="{ item }">
|
|
212
|
+
<CdsListItem :height="36" :title="item.title" />
|
|
213
|
+
</template>
|
|
214
|
+
</CdsVirtualScroll>
|
|
215
|
+
</CdsList>
|
|
216
|
+
</CdsCard>
|
|
217
|
+
</div>
|
|
218
|
+
</template>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Selection in a long list
|
|
222
|
+
|
|
223
|
+
The rows outside the screen do not exist in the DOM, so keep the selection state in the data, not in the rows themselves. In the demo the checked `id`s live in a `Set`: the checkbox of a row reads it and changes it on click — the selection survives any scrolling.
|
|
224
|
+
|
|
225
|
+
**Example (SFC):**
|
|
226
|
+
|
|
227
|
+
```vue
|
|
228
|
+
<script setup lang="ts">
|
|
229
|
+
import { CdsCard, CdsCheckbox, CdsVirtualScroll } from '@central-design-system/components';
|
|
230
|
+
import { ref } from 'vue';
|
|
231
|
+
|
|
232
|
+
const departments = ['Закупки', 'Продажи', 'Логистика', 'Финансы'];
|
|
233
|
+
|
|
234
|
+
const employees = Array.from({ length: 8000 }, (_, index) => ({
|
|
235
|
+
id: index + 1,
|
|
236
|
+
name: `Сотрудник ${index + 1}`,
|
|
237
|
+
department: departments[index % departments.length]
|
|
238
|
+
}));
|
|
239
|
+
|
|
240
|
+
const selected = ref(new Set<number>());
|
|
241
|
+
|
|
242
|
+
function toggle(id: number) {
|
|
243
|
+
if (selected.value.has(id)) {
|
|
244
|
+
selected.value.delete(id);
|
|
245
|
+
} else {
|
|
246
|
+
selected.value.add(id);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
</script>
|
|
250
|
+
|
|
251
|
+
<template>
|
|
252
|
+
<div class="m-auto flex w-[360px] flex-col gap-2">
|
|
253
|
+
<CdsCard>
|
|
254
|
+
<CdsVirtualScroll height="260" item-height="40" item-key="id" :items="employees">
|
|
255
|
+
<template #default="{ item }">
|
|
256
|
+
<div class="flex h-[40px] items-center justify-between px-2">
|
|
257
|
+
<CdsCheckbox
|
|
258
|
+
hide-details
|
|
259
|
+
:label="item.name"
|
|
260
|
+
:model-value="selected.has(item.id)"
|
|
261
|
+
@update:model-value="toggle(item.id)"
|
|
262
|
+
/>
|
|
263
|
+
<span class="text-100 text-content-secondary">{{ item.department }}</span>
|
|
264
|
+
</div>
|
|
265
|
+
</template>
|
|
266
|
+
</CdsVirtualScroll>
|
|
267
|
+
</CdsCard>
|
|
268
|
+
|
|
269
|
+
<div class="text-100 text-content-secondary">Выбрано получателей: {{ selected.size }}</div>
|
|
270
|
+
</div>
|
|
271
|
+
</template>
|
|
272
|
+
```
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# CdsVirtualScroll — guidelines
|
|
2
|
+
|
|
3
|
+
> Extracted from `docs/demos/Guidelines.vue` by `bun run generate:skill`. Do not edit manually.
|
|
4
|
+
> The full component contract is in [api.md](api.md).
|
|
5
|
+
|
|
6
|
+
| ✅ Do | ❌ Don't |
|
|
7
|
+
| --- | --- |
|
|
8
|
+
| A short list renders in full — with the regular CdsList, without a nested scroll. | Virtualizing a few rows speeds up nothing, while an extra scroll container hides part of the list. |
|
|
9
|
+
| A search next to a long list leads to the right row in seconds. | Scrolling by hand is the only way to find a record among thousands of rows. |
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# CdsVirtualScroll — tokens (level 3)
|
|
2
|
+
|
|
3
|
+
> Copy of the component's `styles/*.variables.scss`, taken by `bun run generate:skill`. Do not edit manually.
|
|
4
|
+
> `--cds-*` are global level-2 tokens whose values come from the active theme: see [themes.md](../../tokens/themes.md).
|
|
5
|
+
> Variables marked `!default` can be overridden at build time via SCSS.
|
|
6
|
+
|
|
7
|
+
## _CdsVirtualScroll.variables.scss
|
|
8
|
+
|
|
9
|
+
```scss
|
|
10
|
+
@use '../../../styles/settings';
|
|
11
|
+
|
|
12
|
+
$virtual-scroll-max-width: 100% !default;
|
|
13
|
+
```
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# CDS 4 conventions
|
|
2
|
+
|
|
3
|
+
The golden rule: **the source of truth is the component's `api.md`**
|
|
4
|
+
(`references/components/<name>/api.md`). Do not invent props, events or
|
|
5
|
+
slots — if they are not in api.md, they do not exist on the component.
|
|
6
|
+
|
|
7
|
+
## Shared props
|
|
8
|
+
|
|
9
|
+
The props below come from shared composable factories and behave identically
|
|
10
|
+
in every component that has them:
|
|
11
|
+
|
|
12
|
+
| Prop | Semantics |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| `size` | Size: `xs` / `sm` / `md` / `lg` / `xl` or a number |
|
|
15
|
+
| `appearance` | Appearance (visual variant); the set of values is component-specific — check the type in api.md |
|
|
16
|
+
| `color` / `bgColor` | Content / background color as a **theme token**, not a CSS value |
|
|
17
|
+
| `disabled` | Disabled state |
|
|
18
|
+
| `loading` | Loading state |
|
|
19
|
+
| `width` / `height` | Dimensions (number → px, or a CSS value as a string) |
|
|
20
|
+
|
|
21
|
+
## Tokens, not raw values
|
|
22
|
+
|
|
23
|
+
- Set colors via the `color` prop / theme tokens (`--cds-color-*`), never
|
|
24
|
+
arbitrary CSS (`#fff`, `red`). Theme tokens are listed in [../tokens/themes.md](../tokens/themes.md).
|
|
25
|
+
- Spacing, radii and other values in custom SCSS go through the global
|
|
26
|
+
`--cds-*` variables, never hardcoded.
|
|
27
|
+
|
|
28
|
+
## Atomic Design
|
|
29
|
+
|
|
30
|
+
Complex UI is composed from atoms. Example — a form: the ready-made
|
|
31
|
+
`CdsTextInput` "molecule" is internally built as `CdsField` + `CdsLabel` +
|
|
32
|
+
`CdsDescription` + `CdsMessages` + `CdsInput`, and the same atoms are
|
|
33
|
+
available for building your own fields. See the [Forms](forms.md) guide
|
|
34
|
+
for details.
|
|
35
|
+
|
|
36
|
+
## Defaults
|
|
37
|
+
|
|
38
|
+
Prop defaults can be set centrally:
|
|
39
|
+
|
|
40
|
+
- globally — via the `defaults` option in `createCds({ defaults: { CdsButton: { size: 'lg' } } })`;
|
|
41
|
+
- for a subtree — with the `CdsDefaultsProvider` component
|
|
42
|
+
([api](../components/cds-defaults-provider/api.md)).
|
|
43
|
+
|
|
44
|
+
## Deprecated APIs
|
|
45
|
+
|
|
46
|
+
Props/components marked `_(deprecated)_` in api.md still work but will be
|
|
47
|
+
removed. In the dev console they emit a warning prefixed `[CDS UPGRADE]`.
|
|
48
|
+
When migrating legacy code, see the [migration guide](migration-cds3-to-cds4.md).
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
---
|
|
2
|
+
sourceHash: 16f5caa5227fd7ac98a4d370070985a7094a8a2b
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Date Utils
|
|
6
|
+
|
|
7
|
+
Central Design System includes a set of functions for working with the native JS
|
|
8
|
+
`Date`: mask-based formatting, string parsing, arithmetic, comparison and
|
|
9
|
+
calendar math. You don't need a separate date library (dayjs, date-fns) for
|
|
10
|
+
everyday tasks. The date and time components use the very same functions —
|
|
11
|
+
[CdsDateInput](../components/cds-date-input/api.md), [CdsDatePicker](../components/cds-date-picker/api.md),
|
|
12
|
+
[CdsTimePicker](../components/cds-time-picker/api.md) — so format masks are identical in
|
|
13
|
+
the utilities and in the components.
|
|
14
|
+
|
|
15
|
+
The functions accept a `Date`, a timestamp (milliseconds) or a date string,
|
|
16
|
+
return a native `Date` and **never mutate** the arguments you pass — the result
|
|
17
|
+
is always a new object.
|
|
18
|
+
|
|
19
|
+
## Setup
|
|
20
|
+
|
|
21
|
+
The utilities are exported from the package under the `utils` namespace:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { utils } from '@central-design-system/components';
|
|
25
|
+
|
|
26
|
+
const { formatDate, addToDate } = utils;
|
|
27
|
+
|
|
28
|
+
formatDate(new Date(2026, 7, 18), 'DD.MM.YYYY'); // '18.08.2026'
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Formatting — `formatDate`
|
|
32
|
+
|
|
33
|
+
`formatDate(value, mask, dateLocale?)` turns a date into a string using a mask:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
const { formatDate } = utils;
|
|
37
|
+
|
|
38
|
+
formatDate(new Date(2026, 7, 18, 14, 30), 'DD.MM.YYYY HH:mm'); // '18.08.2026 14:30'
|
|
39
|
+
formatDate(Date.now(), 'D MMM YYYY'); // '18 Авг 2026'
|
|
40
|
+
formatDate(new Date(2026, 7, 18), 'dddd'); // 'Вторник'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Without a mask, an ISO-like format is used: `YYYY-MM-DDTHH:mm:ss.SSSZ`.
|
|
44
|
+
For an invalid value the function returns `undefined`.
|
|
45
|
+
|
|
46
|
+
Month and weekday names come from the Russian date locale by default. To print
|
|
47
|
+
them in another language, pass a date locale as the third argument — the
|
|
48
|
+
built-in ones live in the `locales` export:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
import { locales, utils } from '@central-design-system/components';
|
|
52
|
+
|
|
53
|
+
utils.formatDate(new Date(2026, 7, 18), 'dddd, D MMMM', locales.enDate);
|
|
54
|
+
// 'Tuesday, 18 August'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Your own language is plugged in as a `TDateLocale` object — the same fields as
|
|
58
|
+
`locales.ruDate`. See the [Internationalization](internationalization.md#dates)
|
|
59
|
+
guide for more on date locales.
|
|
60
|
+
|
|
61
|
+
### Format tokens
|
|
62
|
+
|
|
63
|
+
| Unit | Token | Result |
|
|
64
|
+
| --- | --- | --- |
|
|
65
|
+
| Year | `YY` / `YYYY` | `26` / `2026` |
|
|
66
|
+
| Month | `M` / `MM` | `8` / `08` |
|
|
67
|
+
| Month (name) | `MMM` / `MMMM` | `Авг` / `Август` |
|
|
68
|
+
| Quarter | `Q` / `Qo` | `3` / `3rd` |
|
|
69
|
+
| Day of month | `D` / `Do` / `DD` | `18` / `18th` / `18` |
|
|
70
|
+
| Day of year | `DDD` / `DDDD` | `230` / `230` (zero-padded to 3 digits) |
|
|
71
|
+
| Day of week | `d` | `2` (0 — Sunday) |
|
|
72
|
+
| Day of week (name) | `dd` / `ddd` / `dddd` | `Вт` / `Вт` / `Вторник` |
|
|
73
|
+
| Day of week (ISO) | `E` | `2` (1 — Monday, 7 — Sunday) |
|
|
74
|
+
| Week of year | `w` / `ww` | `34` / `34` |
|
|
75
|
+
| Hour (0–23) | `H` / `HH` | `14` / `14` |
|
|
76
|
+
| Hour (1–12) | `h` / `hh` | `2` / `02` |
|
|
77
|
+
| Minute | `m` / `mm` | `30` / `30` |
|
|
78
|
+
| Second | `s` / `ss` | `5` / `05` |
|
|
79
|
+
| Fractions of a second | `S` / `SS` / `SSS` | `1` / `12` / `123` |
|
|
80
|
+
| Time zone | `Z` / `ZZ` | `+03:00` / `+0300` |
|
|
81
|
+
| Meridiem | `A` / `a` / `aa` | `PM` / `pm` / `p.m.` |
|
|
82
|
+
| Unix time | `X` / `x` | seconds / milliseconds |
|
|
83
|
+
|
|
84
|
+
Ordinal suffixes (`Do`, `Qo`) are English (`1st`, `2nd`…) regardless of the
|
|
85
|
+
locale.
|
|
86
|
+
|
|
87
|
+
Arbitrary text inside a mask is escaped with square brackets:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
formatDate(new Date(2026, 7, 18), '[Сегодня] DD.MM'); // 'Сегодня 18.08'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Parsing — `extractDate` and `splitDate`
|
|
94
|
+
|
|
95
|
+
`extractDate(str, mask, dateLocale?)` parses a string with a mask and returns a
|
|
96
|
+
`Date`:
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
const { extractDate } = utils;
|
|
100
|
+
|
|
101
|
+
extractDate('21.03.1985', 'DD.MM.YYYY'); // Date: 21 March 1985
|
|
102
|
+
extractDate('2019-10-29 23:12', 'YYYY-MM-DD HH:mm'); // Date: 29 October 2019, 23:12
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Month and day names inside the string are recognized through the date locale —
|
|
106
|
+
Russian by default, just like in `formatDate`.
|
|
107
|
+
|
|
108
|
+
A non-existent day overflows following the rules of the native `Date`:
|
|
109
|
+
`extractDate('30.02.2024', 'DD.MM.YYYY')` gives 1 March 2024. When you need
|
|
110
|
+
strict input validation, format the result back and compare it with the string:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
const strict = (str: string, mask: string) => formatDate(extractDate(str, mask), mask) === str;
|
|
114
|
+
|
|
115
|
+
strict('18.08.2026', 'DD.MM.YYYY'); // true
|
|
116
|
+
strict('30.02.2024', 'DD.MM.YYYY'); // false — overflowed into 01.03.2024
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
If you don't need a `Date`, `splitDate(str, mask, dateLocale?)` splits the string
|
|
120
|
+
into its parts — an `IRawDate` object with the fields `year`, `month`, `day`,
|
|
121
|
+
`hour`, `minute`, `second`, `millisecond` (anything not found is `null`):
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
const { splitDate } = utils;
|
|
125
|
+
|
|
126
|
+
splitDate('18.08.2026', 'DD.MM.YYYY');
|
|
127
|
+
// { year: 2026, month: 8, day: 18, hour: null, … }
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Creating and changing
|
|
131
|
+
|
|
132
|
+
### `buildDate`
|
|
133
|
+
|
|
134
|
+
`buildDate(modified, utc?)` — the current moment with individual parts replaced.
|
|
135
|
+
Handy when you need "now, but at 15:00" or "today, but in 2010":
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
const { buildDate } = utils;
|
|
139
|
+
|
|
140
|
+
buildDate({ year: 2010, day: 5, hour: 15 });
|
|
141
|
+
// current month, minutes and seconds; year 2010, day 5, hour 15
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Supported object fields: `year`, `month` (1–12), `day` (or `date`), `hour`,
|
|
145
|
+
`minute`, `second`, `millisecond`.
|
|
146
|
+
|
|
147
|
+
### `adjustDate`
|
|
148
|
+
|
|
149
|
+
`adjustDate(date, modified, utc?)` — the same thing, but for an arbitrary date:
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
const { adjustDate } = utils;
|
|
153
|
+
|
|
154
|
+
adjustDate(new Date(2026, 10, 2), { year: 2010, month: 2 });
|
|
155
|
+
// Date: 2 February 2010
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Note that `month` here is 1-based (February is `2`), unlike in the `Date`
|
|
159
|
+
constructor.
|
|
160
|
+
|
|
161
|
+
### `addToDate` / `subtractFromDate`
|
|
162
|
+
|
|
163
|
+
Add and subtract intervals. The object fields are the same, but they mean "how
|
|
164
|
+
much to add" rather than "what to set":
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
const { addToDate, subtractFromDate } = utils;
|
|
168
|
+
|
|
169
|
+
addToDate(new Date(2026, 2, 7), { day: 7, month: 1 }); // Date: 14 April 2026
|
|
170
|
+
subtractFromDate(new Date(2026, 2, 7), { hour: 24 }); // Date: 6 March 2026
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### `startOfDate` / `endOfDate`
|
|
174
|
+
|
|
175
|
+
The start and the end of a period — year, month, day, hour, minute or second:
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
const { startOfDate, endOfDate } = utils;
|
|
179
|
+
|
|
180
|
+
startOfDate(new Date(2026, 7, 18, 14, 30), 'year'); // Date: 1 January 2026, 00:00:00.000
|
|
181
|
+
endOfDate(new Date(2026, 7, 18, 14, 30), 'month'); // Date: 31 August 2026, 23:59:59.999
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Period unit: `'year'`, `'month'`, `'day'`, `'hour'`, `'minute'`, `'second'`
|
|
185
|
+
(the plural form is accepted too).
|
|
186
|
+
|
|
187
|
+
## Comparison and ranges
|
|
188
|
+
|
|
189
|
+
### `isSameDate`
|
|
190
|
+
|
|
191
|
+
Compares dates down to a unit: `'year'` — the year only, `'month'` — month and
|
|
192
|
+
year, `'day'` — the calendar day, and so on. Without a unit, the timestamps are
|
|
193
|
+
compared in full.
|
|
194
|
+
|
|
195
|
+
```ts
|
|
196
|
+
const { isSameDate } = utils;
|
|
197
|
+
|
|
198
|
+
isSameDate(new Date(2026, 7, 1), new Date(2026, 7, 30), 'month'); // true
|
|
199
|
+
isSameDate(new Date(2026, 7, 1), new Date(2026, 7, 30), 'day'); // false
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### `getDateDiff`
|
|
203
|
+
|
|
204
|
+
The difference between two dates in the chosen unit (days by default):
|
|
205
|
+
|
|
206
|
+
```ts
|
|
207
|
+
const { getDateDiff } = utils;
|
|
208
|
+
|
|
209
|
+
getDateDiff(new Date(2026, 4, 12), new Date(2026, 3, 8)); // 34 (days)
|
|
210
|
+
getDateDiff(new Date(2026, 4, 12), new Date(2026, 3, 8), 'months'); // 1
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### `isBetweenDates` / `getDateBetween`
|
|
214
|
+
|
|
215
|
+
`isBetweenDates(date, from, to, opts?)` checks whether a date falls inside a
|
|
216
|
+
range. The bounds are excluded by default; the `inclusiveFrom` and `inclusiveTo`
|
|
217
|
+
options include them, and `onlyDate: true` compares calendar days only, ignoring
|
|
218
|
+
the time:
|
|
219
|
+
|
|
220
|
+
```ts
|
|
221
|
+
const { isBetweenDates } = utils;
|
|
222
|
+
|
|
223
|
+
isBetweenDates(date, from, to); // strict range
|
|
224
|
+
isBetweenDates(date, from, to, { inclusiveFrom: true, inclusiveTo: true, onlyDate: true });
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
`getDateBetween(date, min, max)` clamps a date to a range: it returns the date
|
|
228
|
+
itself if it is inside, otherwise the nearest bound:
|
|
229
|
+
|
|
230
|
+
```ts
|
|
231
|
+
const { getDateBetween } = utils;
|
|
232
|
+
|
|
233
|
+
getDateBetween(new Date(2025, 0, 1), new Date(2026, 0, 1), new Date(2026, 11, 31));
|
|
234
|
+
// Date: 1 January 2026 — the date is below the minimum, so the min bound came back
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### `getMinDate` / `getMaxDate`
|
|
238
|
+
|
|
239
|
+
The smallest and the largest of a set of dates. They return a timestamp (number) —
|
|
240
|
+
wrap it in `new Date()` if you need a date object:
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
const { getMinDate, getMaxDate } = utils;
|
|
244
|
+
|
|
245
|
+
const min = getMinDate(new Date(2026, 6, 24), new Date(2026, 5, 20), new Date(2026, 6, 26));
|
|
246
|
+
new Date(min); // Date: 20 June 2026
|
|
247
|
+
|
|
248
|
+
const dates = [/* Date[] */];
|
|
249
|
+
const max = getMaxDate(dates[0], ...dates.slice(1));
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Calendar
|
|
253
|
+
|
|
254
|
+
```ts
|
|
255
|
+
const { getDayOfWeek, getWeekOfYear, getDayOfYear, daysInMonth } = utils;
|
|
256
|
+
|
|
257
|
+
getDayOfWeek(new Date(2026, 7, 16)); // 7 — Sunday (ISO: 1 — Monday)
|
|
258
|
+
getWeekOfYear(new Date(2026, 0, 4)); // 1 — ISO week number in the year
|
|
259
|
+
getDayOfYear(new Date(2026, 1, 4)); // 35 — ordinal day in the year
|
|
260
|
+
daysInMonth(new Date(2024, 1, 15)); // 29 — February of a leap year
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Other
|
|
264
|
+
|
|
265
|
+
### `isValidDate`
|
|
266
|
+
|
|
267
|
+
Checks whether a value parses into a date:
|
|
268
|
+
|
|
269
|
+
```ts
|
|
270
|
+
const { isValidDate } = utils;
|
|
271
|
+
|
|
272
|
+
isValidDate('2026-08-18'); // true
|
|
273
|
+
isValidDate('не дата'); // false
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
The check is syntactic — it does not catch non-existent calendar days
|
|
277
|
+
(see `splitDate` above).
|
|
278
|
+
|
|
279
|
+
### `cloneDate`
|
|
280
|
+
|
|
281
|
+
A copy of a date. Useful before handing it to third-party code that might mutate
|
|
282
|
+
the object (CDS utilities themselves never modify their arguments):
|
|
283
|
+
|
|
284
|
+
```ts
|
|
285
|
+
const { cloneDate } = utils;
|
|
286
|
+
|
|
287
|
+
const copy = cloneDate(original);
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### `inferDateFormat`
|
|
291
|
+
|
|
292
|
+
Detects the shape of a value — handy for returning the result in the same form
|
|
293
|
+
the value came in:
|
|
294
|
+
|
|
295
|
+
```ts
|
|
296
|
+
const { inferDateFormat } = utils;
|
|
297
|
+
|
|
298
|
+
inferDateFormat(new Date()); // 'date'
|
|
299
|
+
inferDateFormat(1787059805000); // 'number'
|
|
300
|
+
inferDateFormat('18.08.2026'); // 'string'
|
|
301
|
+
```
|