@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,794 @@
|
|
|
1
|
+
# CdsSelect — usage examples
|
|
2
|
+
|
|
3
|
+
> Extracted from Storybook stories (`docs/*.stories.ts`) by `bun run generate:skill`. Do not edit manually.
|
|
4
|
+
> The full component contract is in [api.md](api.md). `v-bind="args"` in templates refers to the props from the **Args** block of the corresponding example.
|
|
5
|
+
|
|
6
|
+
A select opens a dropdown list and lets you pick one or several values from a known set: a country, a status, a category. The field is built on [CdsTextInput](../cds-text-input/api.md), so the label, the description, the messages, validation and the states work exactly as in a text field.
|
|
7
|
+
|
|
8
|
+
## List items
|
|
9
|
+
|
|
10
|
+
The list is set by the `items` prop — an array of strings or of objects with the same interface as in [CdsList](../cds-list/api.md). While no value is selected, the field shows the `placeholder`.
|
|
11
|
+
|
|
12
|
+
**Example (SFC):**
|
|
13
|
+
|
|
14
|
+
```vue
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
import { CdsSelect } from '@central-design-system/components';
|
|
17
|
+
import { ref } from 'vue';
|
|
18
|
+
|
|
19
|
+
const items = ['Первый', 'Второй', 'Третий', 'Четвёртый'];
|
|
20
|
+
|
|
21
|
+
const selected = ref(null);
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<template>
|
|
25
|
+
<div class="w-[350px] m-auto">
|
|
26
|
+
<CdsSelect
|
|
27
|
+
v-model="selected"
|
|
28
|
+
:items="items"
|
|
29
|
+
label="Выберите значение"
|
|
30
|
+
placeholder="Выбрать значение"
|
|
31
|
+
description="Вспомогательное описание для выбора из списка"
|
|
32
|
+
/>
|
|
33
|
+
</div>
|
|
34
|
+
</template>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Your own data fields
|
|
38
|
+
|
|
39
|
+
When the objects come from the server as they are, use `item-title` and `item-value` to say which fields the title and the value are taken from. `return-object` puts the whole object into `v-model` instead of just the value.
|
|
40
|
+
|
|
41
|
+
**Example (SFC):**
|
|
42
|
+
|
|
43
|
+
```vue
|
|
44
|
+
<script setup lang="ts">
|
|
45
|
+
import { CdsSelect } from '@central-design-system/components';
|
|
46
|
+
import { ref } from 'vue';
|
|
47
|
+
|
|
48
|
+
const select = ref({ lang: 'Русский', code: 'ru' });
|
|
49
|
+
const languages = ref([
|
|
50
|
+
{ lang: 'English', code: 'en' },
|
|
51
|
+
{ lang: 'Русский', code: 'ru' },
|
|
52
|
+
{ lang: 'Deutsch', code: 'de' },
|
|
53
|
+
{ lang: 'Français', code: 'fr' },
|
|
54
|
+
{ lang: 'Italiano', code: 'it' },
|
|
55
|
+
{ lang: 'Español', code: 'es' },
|
|
56
|
+
{ lang: 'Português', code: 'pt' },
|
|
57
|
+
{ lang: 'Nederlands', code: 'nl' },
|
|
58
|
+
{ lang: 'Polski', code: 'pl' },
|
|
59
|
+
{ lang: 'Svenska', code: 'sv' },
|
|
60
|
+
{ lang: 'Dansk', code: 'da' },
|
|
61
|
+
{ lang: 'Türkçe', code: 'tr' },
|
|
62
|
+
{ lang: '日本語', code: 'ja' },
|
|
63
|
+
{ lang: '中文', code: 'zh' },
|
|
64
|
+
{ lang: '한국어', code: 'ko' },
|
|
65
|
+
{ lang: 'العربية', code: 'ar' },
|
|
66
|
+
{ lang: 'עברית', code: 'he' }
|
|
67
|
+
]);
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
<template>
|
|
71
|
+
<div class="w-[350px] m-auto">
|
|
72
|
+
<CdsSelect
|
|
73
|
+
v-model="select"
|
|
74
|
+
:items="languages"
|
|
75
|
+
item-title="lang"
|
|
76
|
+
item-value="code"
|
|
77
|
+
return-object
|
|
78
|
+
label="Выберите язык"
|
|
79
|
+
placeholder="Выбрать язык"
|
|
80
|
+
:messages="select.lang + ' (' + select.code + ')'"
|
|
81
|
+
/>
|
|
82
|
+
</div>
|
|
83
|
+
</template>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Grouping
|
|
87
|
+
|
|
88
|
+
Split a long list into meaningful blocks: an item with `type: 'subheader'` adds a subheader, one with `type: 'divider'` — a divider. Such items cannot be selected.
|
|
89
|
+
|
|
90
|
+
**Example (SFC):**
|
|
91
|
+
|
|
92
|
+
```vue
|
|
93
|
+
<script setup lang="ts">
|
|
94
|
+
import { CdsSelect } from '@central-design-system/components';
|
|
95
|
+
import { ref } from 'vue';
|
|
96
|
+
|
|
97
|
+
const items = [
|
|
98
|
+
{ type: 'subheader', title: 'Европа' },
|
|
99
|
+
'Австрия',
|
|
100
|
+
'Германия',
|
|
101
|
+
'Франция',
|
|
102
|
+
{ type: 'divider' },
|
|
103
|
+
{ type: 'subheader', title: 'Азия' },
|
|
104
|
+
'Китай',
|
|
105
|
+
'Южная Корея',
|
|
106
|
+
'Япония'
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
const selected = ref(null);
|
|
110
|
+
</script>
|
|
111
|
+
|
|
112
|
+
<template>
|
|
113
|
+
<div class="w-[350px] m-auto">
|
|
114
|
+
<CdsSelect v-model="selected" :items="items" label="Страна производства" placeholder="Выберите страну" />
|
|
115
|
+
</div>
|
|
116
|
+
</template>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Multiple selection
|
|
120
|
+
|
|
121
|
+
The `multiple` prop allows selecting several values: the items get checkboxes and the field lists the selection separated by commas. `ellipsis` keeps the listing on a single line and cuts the rest off with an ellipsis.
|
|
122
|
+
|
|
123
|
+
**Example (SFC):**
|
|
124
|
+
|
|
125
|
+
```vue
|
|
126
|
+
<script setup lang="ts">
|
|
127
|
+
import { CdsSelect } from '@central-design-system/components';
|
|
128
|
+
import { ref } from 'vue';
|
|
129
|
+
|
|
130
|
+
const items = ref([
|
|
131
|
+
'Австрия',
|
|
132
|
+
'Бельгия',
|
|
133
|
+
'Болгария',
|
|
134
|
+
'Венгрия',
|
|
135
|
+
'Германия',
|
|
136
|
+
'Греция',
|
|
137
|
+
'Дания',
|
|
138
|
+
'Ирландия',
|
|
139
|
+
'Испания',
|
|
140
|
+
'Италия',
|
|
141
|
+
'Кипр',
|
|
142
|
+
'Латвия',
|
|
143
|
+
'Литва',
|
|
144
|
+
'Люксембург',
|
|
145
|
+
'Мальта',
|
|
146
|
+
'Нидерланды',
|
|
147
|
+
'Польша',
|
|
148
|
+
'Португалия',
|
|
149
|
+
'Румыния',
|
|
150
|
+
'Словакия',
|
|
151
|
+
'Словения',
|
|
152
|
+
'Финляндия',
|
|
153
|
+
'Франция',
|
|
154
|
+
'Хорватия',
|
|
155
|
+
'Чехия',
|
|
156
|
+
'Швеция',
|
|
157
|
+
'Эстония'
|
|
158
|
+
]);
|
|
159
|
+
|
|
160
|
+
const selected = ref([]);
|
|
161
|
+
</script>
|
|
162
|
+
|
|
163
|
+
<template>
|
|
164
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
165
|
+
<CdsSelect v-model="selected" multiple :items="items" label="Множественный выбор" placeholder="Выбрать страну" />
|
|
166
|
+
|
|
167
|
+
<CdsSelect
|
|
168
|
+
v-model="selected"
|
|
169
|
+
multiple
|
|
170
|
+
ellipsis
|
|
171
|
+
:items="items"
|
|
172
|
+
label="Множественный выбор в строку"
|
|
173
|
+
placeholder="Выбрать страну"
|
|
174
|
+
/>
|
|
175
|
+
</div>
|
|
176
|
+
</template>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Selecting all the values
|
|
180
|
+
|
|
181
|
+
The `is-select-all` prop adds a "select all" entry as the first item of the list (works together with `multiple`). The `true` value uses the default caption, a string sets your own.
|
|
182
|
+
|
|
183
|
+
**Example (SFC):**
|
|
184
|
+
|
|
185
|
+
```vue
|
|
186
|
+
<script setup lang="ts">
|
|
187
|
+
import { CdsSelect } from '@central-design-system/components';
|
|
188
|
+
import { ref } from 'vue';
|
|
189
|
+
|
|
190
|
+
const items = ref([
|
|
191
|
+
'Австрия',
|
|
192
|
+
'Бельгия',
|
|
193
|
+
'Болгария',
|
|
194
|
+
'Венгрия',
|
|
195
|
+
'Германия',
|
|
196
|
+
'Греция',
|
|
197
|
+
'Дания',
|
|
198
|
+
'Ирландия',
|
|
199
|
+
'Испания',
|
|
200
|
+
'Италия',
|
|
201
|
+
'Кипр',
|
|
202
|
+
'Латвия',
|
|
203
|
+
'Литва',
|
|
204
|
+
'Люксембург',
|
|
205
|
+
'Мальта',
|
|
206
|
+
'Нидерланды',
|
|
207
|
+
'Польша',
|
|
208
|
+
'Португалия',
|
|
209
|
+
'Румыния',
|
|
210
|
+
'Словакия',
|
|
211
|
+
'Словения',
|
|
212
|
+
'Финляндия',
|
|
213
|
+
'Франция',
|
|
214
|
+
'Хорватия',
|
|
215
|
+
'Чехия',
|
|
216
|
+
'Швеция',
|
|
217
|
+
'Эстония'
|
|
218
|
+
]);
|
|
219
|
+
|
|
220
|
+
const selected = ref([]);
|
|
221
|
+
const selectedCustom = ref([]);
|
|
222
|
+
</script>
|
|
223
|
+
|
|
224
|
+
<template>
|
|
225
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
226
|
+
<CdsSelect
|
|
227
|
+
v-model="selected"
|
|
228
|
+
multiple
|
|
229
|
+
is-select-all
|
|
230
|
+
:items="items"
|
|
231
|
+
label="Множественный выбор с «Выбрать все»"
|
|
232
|
+
placeholder="Выбрать страну"
|
|
233
|
+
/>
|
|
234
|
+
|
|
235
|
+
<CdsSelect
|
|
236
|
+
v-model="selectedCustom"
|
|
237
|
+
multiple
|
|
238
|
+
is-select-all="Отметить все страны"
|
|
239
|
+
:items="items"
|
|
240
|
+
label="Своя надпись «Выбрать все»"
|
|
241
|
+
placeholder="Выбрать страну"
|
|
242
|
+
/>
|
|
243
|
+
</div>
|
|
244
|
+
</template>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Chips
|
|
248
|
+
|
|
249
|
+
The `chips` prop shows the selected values as [CdsTag](../cds-tag/api.md) tags, `closable-chips` adds a cross to them — a value is removed right in the field, without opening the menu.
|
|
250
|
+
|
|
251
|
+
**Example (SFC):**
|
|
252
|
+
|
|
253
|
+
```vue
|
|
254
|
+
<script setup lang="ts">
|
|
255
|
+
import { CdsSelect } from '@central-design-system/components';
|
|
256
|
+
import { ref } from 'vue';
|
|
257
|
+
|
|
258
|
+
const items = ['Австрия', 'Бельгия', 'Германия', 'Греция', 'Испания', 'Италия', 'Франция'];
|
|
259
|
+
|
|
260
|
+
const selected = ref(['Германия', 'Испания']);
|
|
261
|
+
const selectedClosable = ref(['Австрия', 'Италия', 'Франция']);
|
|
262
|
+
</script>
|
|
263
|
+
|
|
264
|
+
<template>
|
|
265
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
266
|
+
<CdsSelect v-model="selected" multiple chips :items="items" label="Чипы" placeholder="Выбрать страну" />
|
|
267
|
+
|
|
268
|
+
<CdsSelect
|
|
269
|
+
v-model="selectedClosable"
|
|
270
|
+
multiple
|
|
271
|
+
chips
|
|
272
|
+
closable-chips
|
|
273
|
+
:items="items"
|
|
274
|
+
label="Удаляемые чипы"
|
|
275
|
+
placeholder="Выбрать страну"
|
|
276
|
+
/>
|
|
277
|
+
</div>
|
|
278
|
+
</template>
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Native list
|
|
282
|
+
|
|
283
|
+
The `native-select` prop replaces the custom menu with a native `<select>`: on mobile devices the system list is more familiar. Filtering, virtual scrolling and the menu slots do not work in this mode.
|
|
284
|
+
|
|
285
|
+
**Example (SFC):**
|
|
286
|
+
|
|
287
|
+
```vue
|
|
288
|
+
<script setup lang="ts">
|
|
289
|
+
import { CdsSelect } from '@central-design-system/components';
|
|
290
|
+
import { ref } from 'vue';
|
|
291
|
+
|
|
292
|
+
const items = ['Первый', 'Второй', 'Третий', 'Четвёртый'];
|
|
293
|
+
|
|
294
|
+
const selected = ref(null);
|
|
295
|
+
</script>
|
|
296
|
+
|
|
297
|
+
<template>
|
|
298
|
+
<div class="w-[350px] m-auto">
|
|
299
|
+
<CdsSelect
|
|
300
|
+
v-model="selected"
|
|
301
|
+
native-select
|
|
302
|
+
:items="items"
|
|
303
|
+
label="Выберите значение"
|
|
304
|
+
placeholder="Выбрать значение"
|
|
305
|
+
/>
|
|
306
|
+
</div>
|
|
307
|
+
</template>
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## Tuning the list
|
|
311
|
+
|
|
312
|
+
The `list-props` prop passes any props through to the inner [CdsList](../cds-list/api.md) — in the example `bgColor` paints the background of the menu, and `slim` removes the inner paddings of the menu so that the list fills it entirely. `item-color` sets the color of the selected items (`color` is taken by default). In the same way `menu-props` configures the inner [CdsMenu](../cds-menu/api.md), and `menu-height` limits the height of the menu.
|
|
313
|
+
|
|
314
|
+
**Example (SFC):**
|
|
315
|
+
|
|
316
|
+
```vue
|
|
317
|
+
<script setup lang="ts">
|
|
318
|
+
import { CdsSelect } from '@central-design-system/components';
|
|
319
|
+
import { ref } from 'vue';
|
|
320
|
+
|
|
321
|
+
const items = ['Яблоко', 'Апельсин', 'Банан', 'Груша'];
|
|
322
|
+
|
|
323
|
+
const selected = ref(['Яблоко']);
|
|
324
|
+
</script>
|
|
325
|
+
|
|
326
|
+
<template>
|
|
327
|
+
<div class="w-[350px] m-auto">
|
|
328
|
+
<CdsSelect
|
|
329
|
+
v-model="selected"
|
|
330
|
+
multiple
|
|
331
|
+
:items="items"
|
|
332
|
+
:list-props="{ bgColor: 'other-cyan-fill', slim: true }"
|
|
333
|
+
item-color="status-warning-fill"
|
|
334
|
+
label="Выберите фрукты"
|
|
335
|
+
placeholder="Выбрать фрукт"
|
|
336
|
+
/>
|
|
337
|
+
</div>
|
|
338
|
+
</template>
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
## Slots
|
|
342
|
+
|
|
343
|
+
The `item` slot overrides the rendering of an item completely. Be sure to pass `props` into `CdsListItem` — the selection handler lives in them. In the example every country shows its flag and capital.
|
|
344
|
+
|
|
345
|
+
**Example (SFC):**
|
|
346
|
+
|
|
347
|
+
```vue
|
|
348
|
+
<script setup lang="ts">
|
|
349
|
+
import { CdsListItem, CdsSelect } from '@central-design-system/components';
|
|
350
|
+
import { ref } from 'vue';
|
|
351
|
+
|
|
352
|
+
const countries = ref([
|
|
353
|
+
{ title: 'Австрия', flag: '🇦🇹', capital: 'Вена' },
|
|
354
|
+
{ title: 'Бельгия', flag: '🇧🇪', capital: 'Брюссель' },
|
|
355
|
+
{ title: 'Германия', flag: '🇩🇪', capital: 'Берлин' },
|
|
356
|
+
{ title: 'Греция', flag: '🇬🇷', capital: 'Афины' },
|
|
357
|
+
{ title: 'Испания', flag: '🇪🇸', capital: 'Мадрид' },
|
|
358
|
+
{ title: 'Италия', flag: '🇮🇹', capital: 'Рим' },
|
|
359
|
+
{ title: 'Нидерланды', flag: '🇳🇱', capital: 'Амстердам' },
|
|
360
|
+
{ title: 'Польша', flag: '🇵🇱', capital: 'Варшава' },
|
|
361
|
+
{ title: 'Португалия', flag: '🇵🇹', capital: 'Лиссабон' },
|
|
362
|
+
{ title: 'Финляндия', flag: '🇫🇮', capital: 'Хельсинки' },
|
|
363
|
+
{ title: 'Франция', flag: '🇫🇷', capital: 'Париж' },
|
|
364
|
+
{ title: 'Швеция', flag: '🇸🇪', capital: 'Стокгольм' }
|
|
365
|
+
]);
|
|
366
|
+
</script>
|
|
367
|
+
|
|
368
|
+
<template>
|
|
369
|
+
<CdsSelect class="w-[350px] m-auto" :items="countries" label="Страны" placeholder="Выбрать страну">
|
|
370
|
+
<template #item="{ item, props }">
|
|
371
|
+
<CdsListItem v-bind="props" :title="item.title">
|
|
372
|
+
<template #prepend>
|
|
373
|
+
<span class="mr-3 text-2xl">{{ item.flag }}</span>
|
|
374
|
+
</template>
|
|
375
|
+
<template #description>
|
|
376
|
+
Столица: <strong>{{ item.capital }}</strong>
|
|
377
|
+
</template>
|
|
378
|
+
</CdsListItem>
|
|
379
|
+
</template>
|
|
380
|
+
</CdsSelect>
|
|
381
|
+
</template>
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## Slots
|
|
385
|
+
|
|
386
|
+
The `selection` slot is your own display of what is selected in the field: the first two countries are shown as tags, the rest are folded into a counter.
|
|
387
|
+
|
|
388
|
+
**Example (SFC):**
|
|
389
|
+
|
|
390
|
+
```vue
|
|
391
|
+
<script setup lang="ts">
|
|
392
|
+
import { CdsSelect, CdsTag } from '@central-design-system/components';
|
|
393
|
+
import { ref } from 'vue';
|
|
394
|
+
|
|
395
|
+
const items = ref([
|
|
396
|
+
'Австрия',
|
|
397
|
+
'Бельгия',
|
|
398
|
+
'Германия',
|
|
399
|
+
'Греция',
|
|
400
|
+
'Испания',
|
|
401
|
+
'Италия',
|
|
402
|
+
'Нидерланды',
|
|
403
|
+
'Польша',
|
|
404
|
+
'Португалия',
|
|
405
|
+
'Франция',
|
|
406
|
+
'Швеция'
|
|
407
|
+
]);
|
|
408
|
+
const selected = ref(['Португалия', 'Испания', 'Франция']);
|
|
409
|
+
</script>
|
|
410
|
+
|
|
411
|
+
<template>
|
|
412
|
+
<CdsSelect
|
|
413
|
+
v-model="selected"
|
|
414
|
+
class="w-[350px] m-auto"
|
|
415
|
+
multiple
|
|
416
|
+
:items="items"
|
|
417
|
+
label="Выберите страны"
|
|
418
|
+
placeholder="Выбрать страну"
|
|
419
|
+
>
|
|
420
|
+
<template #selection="{ item, index }">
|
|
421
|
+
<CdsTag v-if="index < 2" :text="item" size="sm" />
|
|
422
|
+
|
|
423
|
+
<span v-if="index === 2" class="self-center text-sm text-gray-500"> (+{{ selected.length - 2 }} ещё) </span>
|
|
424
|
+
</template>
|
|
425
|
+
</CdsSelect>
|
|
426
|
+
</template>
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
## Slots
|
|
430
|
+
|
|
431
|
+
The `prepend-item` and `append-item` slots add your own entries to the start and the end of the list. In the example the start holds "Select all countries" with a checkbox, and the end — "Load more" with a simulated fetch through `loading`.
|
|
432
|
+
|
|
433
|
+
**Example (SFC):**
|
|
434
|
+
|
|
435
|
+
```vue
|
|
436
|
+
<script setup lang="ts">
|
|
437
|
+
import { CdsCheckbox, CdsListItem, CdsListItemDivider, CdsSelect } from '@central-design-system/components';
|
|
438
|
+
import { computed, ref } from 'vue';
|
|
439
|
+
|
|
440
|
+
const allCountries = [
|
|
441
|
+
'Австрия',
|
|
442
|
+
'Бельгия',
|
|
443
|
+
'Болгария',
|
|
444
|
+
'Венгрия',
|
|
445
|
+
'Германия',
|
|
446
|
+
'Греция',
|
|
447
|
+
'Дания',
|
|
448
|
+
'Ирландия',
|
|
449
|
+
'Испания',
|
|
450
|
+
'Италия',
|
|
451
|
+
'Кипр',
|
|
452
|
+
'Латвия',
|
|
453
|
+
'Литва',
|
|
454
|
+
'Люксембург',
|
|
455
|
+
'Мальта',
|
|
456
|
+
'Нидерланды',
|
|
457
|
+
'Польша',
|
|
458
|
+
'Португалия',
|
|
459
|
+
'Румыния',
|
|
460
|
+
'Словакия',
|
|
461
|
+
'Словения',
|
|
462
|
+
'Финляндия',
|
|
463
|
+
'Франция',
|
|
464
|
+
'Хорватия',
|
|
465
|
+
'Чехия',
|
|
466
|
+
'Швеция',
|
|
467
|
+
'Эстония'
|
|
468
|
+
];
|
|
469
|
+
|
|
470
|
+
const loading = ref(false);
|
|
471
|
+
const countries = ref(allCountries.slice(0, 3));
|
|
472
|
+
const selected = ref<string[]>([]);
|
|
473
|
+
|
|
474
|
+
const allSelected = computed(() => countries.value.length > 0 && selected.value.length === countries.value.length);
|
|
475
|
+
const someSelected = computed(() => selected.value.length > 0);
|
|
476
|
+
const hasMore = computed(() => countries.value.length < allCountries.length);
|
|
477
|
+
|
|
478
|
+
function selectingAll() {
|
|
479
|
+
selected.value = allSelected.value ? [] : countries.value.slice();
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
async function addMore() {
|
|
483
|
+
if (!hasMore.value) return;
|
|
484
|
+
|
|
485
|
+
try {
|
|
486
|
+
loading.value = true;
|
|
487
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
488
|
+
|
|
489
|
+
countries.value = [...countries.value, allCountries[countries.value.length]];
|
|
490
|
+
} finally {
|
|
491
|
+
loading.value = false;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
</script>
|
|
495
|
+
|
|
496
|
+
<template>
|
|
497
|
+
<CdsSelect
|
|
498
|
+
v-model="selected"
|
|
499
|
+
class="w-[350px] m-auto"
|
|
500
|
+
multiple
|
|
501
|
+
:loading="loading"
|
|
502
|
+
:items="countries"
|
|
503
|
+
label="Страны"
|
|
504
|
+
placeholder="Выбрать страну"
|
|
505
|
+
>
|
|
506
|
+
<template #prepend-item>
|
|
507
|
+
<CdsListItem title="Выбрать все страны" link @click="selectingAll">
|
|
508
|
+
<template #prepend>
|
|
509
|
+
<CdsCheckbox
|
|
510
|
+
:model-value="allSelected"
|
|
511
|
+
:indeterminate="someSelected && !allSelected"
|
|
512
|
+
tabindex="-1"
|
|
513
|
+
hide-messages
|
|
514
|
+
/>
|
|
515
|
+
</template>
|
|
516
|
+
</CdsListItem>
|
|
517
|
+
|
|
518
|
+
<CdsListItemDivider />
|
|
519
|
+
</template>
|
|
520
|
+
|
|
521
|
+
<template #append-item>
|
|
522
|
+
<CdsListItemDivider />
|
|
523
|
+
|
|
524
|
+
<CdsListItem v-if="hasMore" title="Добавить еще" prepend-icon="add" :disabled="loading" link @click="addMore" />
|
|
525
|
+
</template>
|
|
526
|
+
</CdsSelect>
|
|
527
|
+
</template>
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
## Slots
|
|
531
|
+
|
|
532
|
+
The `menu-header` and `menu-footer` slots add content to the header and the footer of the menu — a search field and a confirmation button, for example. Both slots receive `search` (written into `v-model:search`, it filters the list) and `filteredItems`.
|
|
533
|
+
|
|
534
|
+
**Example (SFC):**
|
|
535
|
+
|
|
536
|
+
```vue
|
|
537
|
+
<script setup lang="ts">
|
|
538
|
+
import { CdsButton, CdsListItemDivider, CdsSelect, CdsTextInput } from '@central-design-system/components';
|
|
539
|
+
import { ref } from 'vue';
|
|
540
|
+
|
|
541
|
+
const items = ref([
|
|
542
|
+
{ id: 1, value: 'Австрия' },
|
|
543
|
+
{ id: 2, value: 'Бельгия' },
|
|
544
|
+
{ id: 3, value: 'Германия' },
|
|
545
|
+
{ id: 4, value: 'Греция' },
|
|
546
|
+
{ id: 5, value: 'Испания' },
|
|
547
|
+
{ id: 6, value: 'Италия' },
|
|
548
|
+
{ id: 7, value: 'Нидерланды' },
|
|
549
|
+
{ id: 8, value: 'Франция' },
|
|
550
|
+
{ id: 9, value: 'Португалия' }
|
|
551
|
+
]);
|
|
552
|
+
const model = ref([]);
|
|
553
|
+
const menu = ref(false);
|
|
554
|
+
</script>
|
|
555
|
+
|
|
556
|
+
<template>
|
|
557
|
+
<CdsSelect
|
|
558
|
+
v-model="model"
|
|
559
|
+
v-model:menu="menu"
|
|
560
|
+
class="w-[350px] m-auto"
|
|
561
|
+
:items="items"
|
|
562
|
+
item-title="value"
|
|
563
|
+
item-value="id"
|
|
564
|
+
multiple
|
|
565
|
+
menu-height="280"
|
|
566
|
+
label="Выберите страны"
|
|
567
|
+
placeholder="Выбрать страну"
|
|
568
|
+
>
|
|
569
|
+
<template #menu-header="{ search, filteredItems }">
|
|
570
|
+
<div class="p-2">
|
|
571
|
+
<CdsTextInput
|
|
572
|
+
v-model="search.value"
|
|
573
|
+
:error="!!search.value && !filteredItems.length"
|
|
574
|
+
placeholder="Поиск..."
|
|
575
|
+
prepend-inner-icon="search"
|
|
576
|
+
clearable
|
|
577
|
+
hide-messages
|
|
578
|
+
/>
|
|
579
|
+
</div>
|
|
580
|
+
|
|
581
|
+
<CdsListItemDivider />
|
|
582
|
+
</template>
|
|
583
|
+
|
|
584
|
+
<template #menu-footer="{ search, filteredItems }">
|
|
585
|
+
<CdsListItemDivider />
|
|
586
|
+
|
|
587
|
+
<div class="flex items-center p-2 pl-4">
|
|
588
|
+
<span v-if="search.value" class="text-sm text-brand-secondary-content">
|
|
589
|
+
Найдено {{ filteredItems.length }} из {{ items.length }}
|
|
590
|
+
</span>
|
|
591
|
+
|
|
592
|
+
<CdsButton class="ml-auto" text="Принять" @click="menu = false" />
|
|
593
|
+
</div>
|
|
594
|
+
</template>
|
|
595
|
+
</CdsSelect>
|
|
596
|
+
</template>
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
## Submitting a form
|
|
600
|
+
|
|
601
|
+
The select takes part in [CdsForm](../cds-form/api.md) validation on a par with text fields: `rules` will not let the form through without a chosen subject. Give optional fields a default value — that way the form is filled in faster.
|
|
602
|
+
|
|
603
|
+
**Example (SFC):**
|
|
604
|
+
|
|
605
|
+
```vue
|
|
606
|
+
<script setup lang="ts">
|
|
607
|
+
import { CdsButton, CdsForm, CdsSelect } from '@central-design-system/components';
|
|
608
|
+
import { ref } from 'vue';
|
|
609
|
+
|
|
610
|
+
const topics = ['Вопрос по заказу', 'Проблема с оплатой', 'Возврат товара', 'Другое'];
|
|
611
|
+
const priorities = ['Низкий', 'Средний', 'Высокий'];
|
|
612
|
+
|
|
613
|
+
const valid = ref(false);
|
|
614
|
+
const topic = ref(null);
|
|
615
|
+
const priority = ref('Средний');
|
|
616
|
+
const loading = ref(false);
|
|
617
|
+
const sent = ref(false);
|
|
618
|
+
|
|
619
|
+
const rules = [(value: string) => !!value || 'Выберите тему обращения'];
|
|
620
|
+
|
|
621
|
+
async function submit() {
|
|
622
|
+
if (!valid.value) return;
|
|
623
|
+
|
|
624
|
+
try {
|
|
625
|
+
loading.value = true;
|
|
626
|
+
sent.value = false;
|
|
627
|
+
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
628
|
+
sent.value = true;
|
|
629
|
+
} finally {
|
|
630
|
+
loading.value = false;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
</script>
|
|
634
|
+
|
|
635
|
+
<template>
|
|
636
|
+
<CdsForm v-model="valid" class="flex flex-col gap-2 w-[350px] m-auto" @submit.prevent="submit">
|
|
637
|
+
<CdsSelect v-model="topic" :items="topics" :rules="rules" label="Тема обращения" placeholder="Выберите тему" />
|
|
638
|
+
|
|
639
|
+
<CdsSelect v-model="priority" :items="priorities" label="Приоритет" />
|
|
640
|
+
|
|
641
|
+
<CdsButton type="submit" :loading="loading" text="Отправить" />
|
|
642
|
+
|
|
643
|
+
<p v-if="sent" class="text-sm text-center">Обращение отправлено</p>
|
|
644
|
+
</CdsForm>
|
|
645
|
+
</template>
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
## Dependent lists
|
|
649
|
+
|
|
650
|
+
The list of cities depends on the chosen country: while there is no country the second select is turned off through `disabled`, and while the options are loading it shows `loading`. When the country changes the chosen city is reset — otherwise a non-existent pair would stay in the form.
|
|
651
|
+
|
|
652
|
+
**Example (SFC):**
|
|
653
|
+
|
|
654
|
+
```vue
|
|
655
|
+
<script setup lang="ts">
|
|
656
|
+
import { CdsSelect } from '@central-design-system/components';
|
|
657
|
+
import { ref, watch } from 'vue';
|
|
658
|
+
|
|
659
|
+
const citiesByCountry: Record<string, string[]> = {
|
|
660
|
+
Германия: ['Берлин', 'Гамбург', 'Мюнхен', 'Франкфурт'],
|
|
661
|
+
Испания: ['Барселона', 'Валенсия', 'Мадрид', 'Севилья'],
|
|
662
|
+
Франция: ['Лион', 'Марсель', 'Ницца', 'Париж']
|
|
663
|
+
};
|
|
664
|
+
const countries = Object.keys(citiesByCountry);
|
|
665
|
+
|
|
666
|
+
const country = ref<string | null>(null);
|
|
667
|
+
const city = ref<string | null>(null);
|
|
668
|
+
const cities = ref<string[]>([]);
|
|
669
|
+
const loading = ref(false);
|
|
670
|
+
|
|
671
|
+
watch(country, async (value) => {
|
|
672
|
+
city.value = null;
|
|
673
|
+
cities.value = [];
|
|
674
|
+
if (!value) return;
|
|
675
|
+
|
|
676
|
+
try {
|
|
677
|
+
loading.value = true;
|
|
678
|
+
await new Promise((resolve) => setTimeout(resolve, 800));
|
|
679
|
+
cities.value = citiesByCountry[value];
|
|
680
|
+
} finally {
|
|
681
|
+
loading.value = false;
|
|
682
|
+
}
|
|
683
|
+
});
|
|
684
|
+
</script>
|
|
685
|
+
|
|
686
|
+
<template>
|
|
687
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
688
|
+
<CdsSelect v-model="country" :items="countries" label="Страна" placeholder="Выберите страну" />
|
|
689
|
+
|
|
690
|
+
<CdsSelect
|
|
691
|
+
v-model="city"
|
|
692
|
+
:items="cities"
|
|
693
|
+
:loading="loading"
|
|
694
|
+
:disabled="!country"
|
|
695
|
+
label="Город"
|
|
696
|
+
:placeholder="country ? 'Выберите город' : 'Сначала выберите страну'"
|
|
697
|
+
/>
|
|
698
|
+
</div>
|
|
699
|
+
</template>
|
|
700
|
+
```
|
|
701
|
+
|
|
702
|
+
## Picking assignees
|
|
703
|
+
|
|
704
|
+
The combination of `multiple`, `chips` and `closable-chips` shows the chosen people as tags and removes them by the cross right in the field. The `item` slot adds an avatar and a role — that way it is easier to find the right person in a long list.
|
|
705
|
+
|
|
706
|
+
**Example (SFC):**
|
|
707
|
+
|
|
708
|
+
```vue
|
|
709
|
+
<script setup lang="ts">
|
|
710
|
+
import { CdsAvatar, CdsListItem, CdsSelect } from '@central-design-system/components';
|
|
711
|
+
import { ref } from 'vue';
|
|
712
|
+
|
|
713
|
+
const people = [
|
|
714
|
+
{ name: 'Анна Смирнова', role: 'Дизайнер', image: 'https://i.pravatar.cc/80?img=47' },
|
|
715
|
+
{ name: 'Дмитрий Орлов', role: 'Разработчик', image: 'https://i.pravatar.cc/80?img=12' },
|
|
716
|
+
{ name: 'Елена Васильева', role: 'Аналитик', image: 'https://i.pravatar.cc/80?img=44' },
|
|
717
|
+
{ name: 'Игорь Крылов', role: 'Разработчик', image: 'https://i.pravatar.cc/80?img=32' },
|
|
718
|
+
{ name: 'Мария Соколова', role: 'Тестировщик', image: 'https://i.pravatar.cc/80?img=26' },
|
|
719
|
+
{ name: 'Павел Зайцев', role: 'Менеджер проекта', image: 'https://i.pravatar.cc/80?img=59' }
|
|
720
|
+
];
|
|
721
|
+
|
|
722
|
+
const selected = ref(['Анна Смирнова']);
|
|
723
|
+
</script>
|
|
724
|
+
|
|
725
|
+
<template>
|
|
726
|
+
<div class="w-[350px] m-auto">
|
|
727
|
+
<CdsSelect
|
|
728
|
+
v-model="selected"
|
|
729
|
+
multiple
|
|
730
|
+
chips
|
|
731
|
+
closable-chips
|
|
732
|
+
:items="people"
|
|
733
|
+
item-title="name"
|
|
734
|
+
item-value="name"
|
|
735
|
+
label="Исполнители"
|
|
736
|
+
placeholder="Добавьте исполнителей"
|
|
737
|
+
>
|
|
738
|
+
<template #item="{ item, props }">
|
|
739
|
+
<CdsListItem v-bind="props" :title="item.name">
|
|
740
|
+
<template #prepend>
|
|
741
|
+
<CdsAvatar :image="item.image" size="sm" class="mr-3" />
|
|
742
|
+
</template>
|
|
743
|
+
<template #description>{{ item.role }}</template>
|
|
744
|
+
</CdsListItem>
|
|
745
|
+
</template>
|
|
746
|
+
</CdsSelect>
|
|
747
|
+
</div>
|
|
748
|
+
</template>
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
## Sorting the results
|
|
752
|
+
|
|
753
|
+
A compact select controls the order of a list: `hide-messages` removes the bottom block, `aria-label` replaces the hidden label for screen readers. The choice is applied at once — an "Apply" button is not needed.
|
|
754
|
+
|
|
755
|
+
**Example (SFC):**
|
|
756
|
+
|
|
757
|
+
```vue
|
|
758
|
+
<script setup lang="ts">
|
|
759
|
+
import { CdsList, CdsListItem, CdsSelect } from '@central-design-system/components';
|
|
760
|
+
import { computed, ref } from 'vue';
|
|
761
|
+
|
|
762
|
+
const sortOptions = ['По алфавиту', 'Сначала дешевле', 'Сначала дороже'];
|
|
763
|
+
const sort = ref('По алфавиту');
|
|
764
|
+
|
|
765
|
+
const products = [
|
|
766
|
+
{ title: 'Кабель силовой', price: 1200 },
|
|
767
|
+
{ title: 'Автомат защиты', price: 350 },
|
|
768
|
+
{ title: 'Розетка накладная', price: 90 },
|
|
769
|
+
{ title: 'Щит распределительный', price: 4800 },
|
|
770
|
+
{ title: 'Светильник потолочный', price: 2100 }
|
|
771
|
+
];
|
|
772
|
+
|
|
773
|
+
const sorted = computed(() => {
|
|
774
|
+
const items = [...products];
|
|
775
|
+
|
|
776
|
+
if (sort.value === 'Сначала дешевле') return items.sort((a, b) => a.price - b.price);
|
|
777
|
+
if (sort.value === 'Сначала дороже') return items.sort((a, b) => b.price - a.price);
|
|
778
|
+
|
|
779
|
+
return items.sort((a, b) => a.title.localeCompare(b.title));
|
|
780
|
+
});
|
|
781
|
+
</script>
|
|
782
|
+
|
|
783
|
+
<template>
|
|
784
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
785
|
+
<CdsSelect v-model="sort" class="w-56 self-end" :items="sortOptions" aria-label="Сортировка" hide-messages />
|
|
786
|
+
|
|
787
|
+
<CdsList>
|
|
788
|
+
<CdsListItem v-for="product of sorted" :key="product.title" :title="product.title">
|
|
789
|
+
<template #append>{{ product.price }} ₽</template>
|
|
790
|
+
</CdsListItem>
|
|
791
|
+
</CdsList>
|
|
792
|
+
</div>
|
|
793
|
+
</template>
|
|
794
|
+
```
|