@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,552 @@
|
|
|
1
|
+
# CdsForm — 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 form joins fields into one group: it collects their validation into a common status, intercepts the submission and can reset the values. CDS fields with the `rules` prop connect to the form automatically — with no registration and no extra code.
|
|
7
|
+
|
|
8
|
+
## Heading and description
|
|
9
|
+
|
|
10
|
+
The `label` prop names the form, `description` adds an explanation under the heading. The slots of the same name accept arbitrary markup.
|
|
11
|
+
|
|
12
|
+
**Example (SFC):**
|
|
13
|
+
|
|
14
|
+
```vue
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
import { CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<template>
|
|
20
|
+
<CdsForm
|
|
21
|
+
label="Адрес доставки"
|
|
22
|
+
description="Привезём заказ по этому адресу"
|
|
23
|
+
class="flex flex-col gap-2 w-[350px] m-auto"
|
|
24
|
+
>
|
|
25
|
+
<CdsTextInput label="Город" placeholder="Москва" />
|
|
26
|
+
<CdsTextInput label="Улица и дом" placeholder="Тверская, 1" />
|
|
27
|
+
</CdsForm>
|
|
28
|
+
</template>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Validity status
|
|
32
|
+
|
|
33
|
+
The `v-model` of the form is the common status of its fields: `null` while the form has not been checked, `false` on errors and `true` when all the fields are valid. The status is updated on the fly — it is handy for blocking the submit button, for example.
|
|
34
|
+
|
|
35
|
+
**Example (SFC):**
|
|
36
|
+
|
|
37
|
+
```vue
|
|
38
|
+
<script setup lang="ts">
|
|
39
|
+
import { CdsButton, CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
40
|
+
import { ref } from 'vue';
|
|
41
|
+
|
|
42
|
+
const valid = ref<boolean | null>(null);
|
|
43
|
+
const login = ref('');
|
|
44
|
+
const password = ref('');
|
|
45
|
+
|
|
46
|
+
const rules = {
|
|
47
|
+
login: [(value: string) => !!value || 'Введите логин'],
|
|
48
|
+
password: [(value: string) => value.length >= 8 || 'Минимум 8 символов']
|
|
49
|
+
};
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<template>
|
|
53
|
+
<CdsForm v-model="valid" class="flex flex-col gap-2 w-[350px] m-auto" @submit.prevent>
|
|
54
|
+
<CdsTextInput v-model="login" :rules="rules.login" label="Логин" placeholder="Введите логин" />
|
|
55
|
+
<CdsTextInput
|
|
56
|
+
v-model="password"
|
|
57
|
+
:rules="rules.password"
|
|
58
|
+
type="password"
|
|
59
|
+
label="Пароль"
|
|
60
|
+
placeholder="Минимум 8 символов"
|
|
61
|
+
/>
|
|
62
|
+
<div class="mt-2">
|
|
63
|
+
<CdsButton :disabled="!valid" type="submit" block>Войти</CdsButton>
|
|
64
|
+
</div>
|
|
65
|
+
</CdsForm>
|
|
66
|
+
</template>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## The moment of validation
|
|
70
|
+
|
|
71
|
+
The `validate-on` prop sets the moment the check runs for all the fields of the form; the field's own `validate-on` takes precedence. Switch the mode and try it out: with `input` (the default) the error appears as you type, with `blur` — after leaving the field, with `submit` — only when the form is submitted.
|
|
72
|
+
|
|
73
|
+
**Example (SFC):**
|
|
74
|
+
|
|
75
|
+
```vue
|
|
76
|
+
<script setup lang="ts">
|
|
77
|
+
import { CdsButton, CdsButtonToggle, CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
78
|
+
import { ref, unref, watch } from 'vue';
|
|
79
|
+
|
|
80
|
+
const mode = ref<'input' | 'blur' | 'submit'>('input');
|
|
81
|
+
const formRef = ref<InstanceType<typeof CdsForm>>();
|
|
82
|
+
|
|
83
|
+
const name = ref('');
|
|
84
|
+
const email = ref('');
|
|
85
|
+
|
|
86
|
+
const rules = {
|
|
87
|
+
name: [(value: string) => !!value || 'Обязательное поле'],
|
|
88
|
+
email: [(value: string) => /.+@.+\..+/.test(value) || 'Некорректная почта']
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
watch(mode, () => unref(formRef)?.resetValidation());
|
|
92
|
+
</script>
|
|
93
|
+
|
|
94
|
+
<template>
|
|
95
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
96
|
+
<div class="flex items-center justify-between">
|
|
97
|
+
<span class="text-sm text-content-secondary">validate-on</span>
|
|
98
|
+
<CdsButtonToggle v-model="mode" mandatory appearance="tertiary" size="sm">
|
|
99
|
+
<CdsButton text="input" value="input" />
|
|
100
|
+
<CdsButton text="blur" value="blur" />
|
|
101
|
+
<CdsButton text="submit" value="submit" />
|
|
102
|
+
</CdsButtonToggle>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<CdsForm ref="formRef" :validate-on="mode" class="flex flex-col gap-2" @submit.prevent>
|
|
106
|
+
<CdsTextInput v-model="name" :rules="rules.name" label="Имя" placeholder="Введите имя" />
|
|
107
|
+
<CdsTextInput v-model="email" :rules="rules.email" label="Электронная почта" placeholder="name@company.ru" />
|
|
108
|
+
<div class="mt-2">
|
|
109
|
+
<CdsButton type="submit">Отправить</CdsButton>
|
|
110
|
+
</div>
|
|
111
|
+
</CdsForm>
|
|
112
|
+
</div>
|
|
113
|
+
</template>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Fast validation
|
|
117
|
+
|
|
118
|
+
The `first-fail` prop stops the check at the first invalid field. Submit the form: the error is shown only for "Имя", although "Фамилия" is invalid too.
|
|
119
|
+
|
|
120
|
+
**Example (SFC):**
|
|
121
|
+
|
|
122
|
+
```vue
|
|
123
|
+
<script setup lang="ts">
|
|
124
|
+
import { CdsButton, CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
125
|
+
import { ref } from 'vue';
|
|
126
|
+
|
|
127
|
+
const firstName = ref('');
|
|
128
|
+
const lastName = ref('1020');
|
|
129
|
+
|
|
130
|
+
const rules = {
|
|
131
|
+
firstName: [(value: string) => value.length >= 3 || 'Имя не короче 3 символов'],
|
|
132
|
+
lastName: [(value: string) => !/\d/.test(value) || 'Фамилия не может содержать цифры']
|
|
133
|
+
};
|
|
134
|
+
</script>
|
|
135
|
+
|
|
136
|
+
<template>
|
|
137
|
+
<CdsForm first-fail class="flex flex-col gap-2 w-[350px] m-auto" @submit.prevent>
|
|
138
|
+
<CdsTextInput v-model="firstName" :rules="rules.firstName" label="Имя" placeholder="Введите имя" />
|
|
139
|
+
<CdsTextInput v-model="lastName" :rules="rules.lastName" label="Фамилия" placeholder="Введите фамилию" />
|
|
140
|
+
<div class="mt-2">
|
|
141
|
+
<CdsButton type="submit">Отправить</CdsButton>
|
|
142
|
+
</div>
|
|
143
|
+
</CdsForm>
|
|
144
|
+
</template>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## States
|
|
148
|
+
|
|
149
|
+
`disabled` blocks all the fields of the form at once, `readonly` keeps the values visible and copyable but forbids changing them. There is no need to configure the individual fields — the state is inherited.
|
|
150
|
+
|
|
151
|
+
**Example (SFC):**
|
|
152
|
+
|
|
153
|
+
```vue
|
|
154
|
+
<script setup lang="ts">
|
|
155
|
+
import { CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
156
|
+
</script>
|
|
157
|
+
|
|
158
|
+
<template>
|
|
159
|
+
<div class="flex flex-col gap-4 w-[350px] m-auto">
|
|
160
|
+
<CdsForm disabled label="Недоступная форма" class="flex flex-col gap-2">
|
|
161
|
+
<CdsTextInput label="Имя" value="Анна Смирнова" />
|
|
162
|
+
<CdsTextInput label="Электронная почта" value="anna@company.ru" />
|
|
163
|
+
</CdsForm>
|
|
164
|
+
<CdsForm readonly label="Только для чтения" class="flex flex-col gap-2">
|
|
165
|
+
<CdsTextInput label="Имя" value="Анна Смирнова" />
|
|
166
|
+
<CdsTextInput label="Электронная почта" value="anna@company.ru" />
|
|
167
|
+
</CdsForm>
|
|
168
|
+
</div>
|
|
169
|
+
</template>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Hiding the details
|
|
173
|
+
|
|
174
|
+
The bottom block with the messages is controlled by the `hide-details` prop on the fields themselves: `true` always hides the block — errors included, `false` always reserves space for it, `auto` shows the block only when there is something to show. In dense forms use `auto`: the fields sit right next to each other, but the validation errors are not lost. Switch the value and submit an empty form.
|
|
175
|
+
|
|
176
|
+
**Example (SFC):**
|
|
177
|
+
|
|
178
|
+
```vue
|
|
179
|
+
<script setup lang="ts">
|
|
180
|
+
import { CdsButton, CdsButtonToggle, CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
181
|
+
import { computed, ref } from 'vue';
|
|
182
|
+
|
|
183
|
+
const mode = ref('auto');
|
|
184
|
+
const hideDetails = computed(() => (mode.value === 'auto' ? ('auto' as const) : mode.value === 'true'));
|
|
185
|
+
|
|
186
|
+
const rules = {
|
|
187
|
+
login: [(value: string) => !!value || 'Логин не может быть пустым'],
|
|
188
|
+
password: [(value: string) => !!value || 'Пароль не может быть пустым']
|
|
189
|
+
};
|
|
190
|
+
</script>
|
|
191
|
+
|
|
192
|
+
<template>
|
|
193
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
194
|
+
<div class="flex items-center justify-between">
|
|
195
|
+
<span class="text-sm text-content-secondary">hide-details</span>
|
|
196
|
+
<CdsButtonToggle v-model="mode" mandatory appearance="tertiary" size="sm">
|
|
197
|
+
<CdsButton text="auto" value="auto" />
|
|
198
|
+
<CdsButton text="true" value="true" />
|
|
199
|
+
<CdsButton text="false" value="false" />
|
|
200
|
+
</CdsButtonToggle>
|
|
201
|
+
</div>
|
|
202
|
+
|
|
203
|
+
<CdsForm class="flex flex-col gap-2" @submit.prevent>
|
|
204
|
+
<template #default="{ reset }">
|
|
205
|
+
<CdsTextInput
|
|
206
|
+
:hide-details="hideDetails"
|
|
207
|
+
:rules="rules.login"
|
|
208
|
+
label="Логин"
|
|
209
|
+
placeholder="Введите логин"
|
|
210
|
+
clearable
|
|
211
|
+
/>
|
|
212
|
+
<CdsTextInput
|
|
213
|
+
:hide-details="hideDetails"
|
|
214
|
+
:rules="rules.password"
|
|
215
|
+
type="password"
|
|
216
|
+
label="Пароль"
|
|
217
|
+
placeholder="Введите пароль"
|
|
218
|
+
/>
|
|
219
|
+
<div class="flex gap-2 mt-2 justify-end">
|
|
220
|
+
<CdsButton appearance="tertiary" @click="reset">Сбросить</CdsButton>
|
|
221
|
+
<CdsButton type="submit">Отправить</CdsButton>
|
|
222
|
+
</div>
|
|
223
|
+
</template>
|
|
224
|
+
</CdsForm>
|
|
225
|
+
</div>
|
|
226
|
+
</template>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Slots
|
|
230
|
+
|
|
231
|
+
The default slot receives the state of the form and the control methods — the "Check" and "Reset" buttons are built without a ref to the component.
|
|
232
|
+
|
|
233
|
+
**Example (SFC):**
|
|
234
|
+
|
|
235
|
+
```vue
|
|
236
|
+
<script setup lang="ts">
|
|
237
|
+
import { CdsButton, CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
238
|
+
import { ref } from 'vue';
|
|
239
|
+
|
|
240
|
+
const valid = ref<boolean | null>(null);
|
|
241
|
+
const value = ref('');
|
|
242
|
+
|
|
243
|
+
const rules = [(input: string) => !!input || 'Не может быть пустым'];
|
|
244
|
+
</script>
|
|
245
|
+
|
|
246
|
+
<template>
|
|
247
|
+
<CdsForm v-model="valid" class="flex flex-col gap-2 w-[350px] m-auto" @submit.prevent>
|
|
248
|
+
<template #default="{ isValid, validate, reset, resetValidation }">
|
|
249
|
+
<CdsTextInput v-model="value" :rules="rules" label="Поле" placeholder="Введите текст" />
|
|
250
|
+
<div class="text-sm text-content-secondary">
|
|
251
|
+
Статус формы: {{ isValid === null ? 'не проверена' : isValid ? 'валидна' : 'есть ошибки' }}
|
|
252
|
+
</div>
|
|
253
|
+
<div class="flex flex-wrap gap-2 mt-2">
|
|
254
|
+
<CdsButton @click="validate">Проверить</CdsButton>
|
|
255
|
+
<CdsButton appearance="secondary" @click="reset">Сброс</CdsButton>
|
|
256
|
+
<CdsButton appearance="tertiary" @click="resetValidation">Сброс валидации</CdsButton>
|
|
257
|
+
</div>
|
|
258
|
+
</template>
|
|
259
|
+
</CdsForm>
|
|
260
|
+
</template>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Submitting a form
|
|
264
|
+
|
|
265
|
+
The `submit` event is a Promise: `await event` returns the validation result, and the handler decides on its own whether to send the data. The `.prevent` modifier turns off the native page submission. The request here is simulated with `setTimeout`, and the button shows `loading` for the duration of the "request".
|
|
266
|
+
|
|
267
|
+
**Example (SFC):**
|
|
268
|
+
|
|
269
|
+
```vue
|
|
270
|
+
<script setup lang="ts">
|
|
271
|
+
import { CdsButton, CdsForm, CdsTextInput, type SubmitEventPromise } from '@central-design-system/components';
|
|
272
|
+
import { ref } from 'vue';
|
|
273
|
+
|
|
274
|
+
const name = ref('');
|
|
275
|
+
const email = ref('');
|
|
276
|
+
const loading = ref(false);
|
|
277
|
+
const sent = ref(false);
|
|
278
|
+
|
|
279
|
+
const rules = {
|
|
280
|
+
name: [(value: string) => !!value || 'Введите имя'],
|
|
281
|
+
email: [(value: string) => /.+@.+\..+/.test(value) || 'Некорректная почта']
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
async function onSubmit(event: SubmitEventPromise) {
|
|
285
|
+
sent.value = false;
|
|
286
|
+
|
|
287
|
+
const { valid } = await event;
|
|
288
|
+
|
|
289
|
+
if (!valid) return;
|
|
290
|
+
|
|
291
|
+
loading.value = true;
|
|
292
|
+
|
|
293
|
+
setTimeout(() => {
|
|
294
|
+
loading.value = false;
|
|
295
|
+
sent.value = true;
|
|
296
|
+
}, 1500);
|
|
297
|
+
}
|
|
298
|
+
</script>
|
|
299
|
+
|
|
300
|
+
<template>
|
|
301
|
+
<CdsForm class="flex flex-col gap-2 w-[350px] m-auto" @submit.prevent="onSubmit">
|
|
302
|
+
<CdsTextInput v-model="name" :rules="rules.name" label="Имя" placeholder="Введите имя" />
|
|
303
|
+
<CdsTextInput v-model="email" :rules="rules.email" label="Электронная почта" placeholder="name@company.ru" />
|
|
304
|
+
<div class="mt-2">
|
|
305
|
+
<CdsButton :loading="loading" type="submit">Отправить заявку</CdsButton>
|
|
306
|
+
</div>
|
|
307
|
+
<div v-if="sent" class="text-sm text-content-secondary">Заявка отправлена — мы напишем вам на почту.</div>
|
|
308
|
+
</CdsForm>
|
|
309
|
+
</template>
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Control from outside
|
|
313
|
+
|
|
314
|
+
The `validate`, `reset` and `resetValidation` methods are also available through a ref to the form. That is how the form is driven from outside — from the footer of a modal or a wizard panel, where the buttons live outside the form markup.
|
|
315
|
+
|
|
316
|
+
**Example (SFC):**
|
|
317
|
+
|
|
318
|
+
```vue
|
|
319
|
+
<script setup lang="ts">
|
|
320
|
+
import { CdsButton, CdsCheckbox, CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
321
|
+
import { ref, unref } from 'vue';
|
|
322
|
+
|
|
323
|
+
const formRef = ref<InstanceType<typeof CdsForm>>();
|
|
324
|
+
|
|
325
|
+
const name = ref('');
|
|
326
|
+
const agree = ref(false);
|
|
327
|
+
const result = ref('');
|
|
328
|
+
|
|
329
|
+
const rules = {
|
|
330
|
+
name: [(value: string) => !!value || 'Введите имя'],
|
|
331
|
+
agree: [(value: boolean) => !!value || 'Нужно согласие, чтобы продолжить']
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
async function validate() {
|
|
335
|
+
const form = unref(formRef);
|
|
336
|
+
|
|
337
|
+
if (!form) return;
|
|
338
|
+
|
|
339
|
+
const { valid } = await form.validate();
|
|
340
|
+
|
|
341
|
+
result.value = valid ? 'Форма валидна' : 'В форме есть ошибки';
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function reset() {
|
|
345
|
+
unref(formRef)?.reset();
|
|
346
|
+
result.value = '';
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function resetValidation() {
|
|
350
|
+
unref(formRef)?.resetValidation();
|
|
351
|
+
result.value = '';
|
|
352
|
+
}
|
|
353
|
+
</script>
|
|
354
|
+
|
|
355
|
+
<template>
|
|
356
|
+
<div class="flex flex-col gap-2 w-[380px] m-auto">
|
|
357
|
+
<CdsForm ref="formRef" class="flex flex-col gap-2">
|
|
358
|
+
<CdsTextInput v-model="name" :rules="rules.name" label="Имя" placeholder="Введите имя" />
|
|
359
|
+
<CdsCheckbox v-model="agree" :rules="rules.agree" label="Согласен с условиями" />
|
|
360
|
+
</CdsForm>
|
|
361
|
+
<div class="flex flex-wrap gap-2">
|
|
362
|
+
<CdsButton @click="validate">Проверить</CdsButton>
|
|
363
|
+
<CdsButton appearance="secondary" @click="reset">Сбросить</CdsButton>
|
|
364
|
+
<CdsButton appearance="tertiary" @click="resetValidation">Сбросить валидацию</CdsButton>
|
|
365
|
+
</div>
|
|
366
|
+
<div v-if="result" class="text-sm text-content-secondary">{{ result }}</div>
|
|
367
|
+
</div>
|
|
368
|
+
</template>
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## Vee-validate
|
|
372
|
+
|
|
373
|
+
The form gets along with external validation libraries. With [vee-validate](https://vee-validate.logaretm.com/v4/) the schema is set in `useForm`, and the error messages of the fields are passed into `error-messages`.
|
|
374
|
+
|
|
375
|
+
**Example (SFC):**
|
|
376
|
+
|
|
377
|
+
```vue
|
|
378
|
+
<script setup lang="ts">
|
|
379
|
+
import { CdsButton, CdsCheckbox, CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
380
|
+
import { useField, useForm } from 'vee-validate';
|
|
381
|
+
import { ref } from 'vue';
|
|
382
|
+
|
|
383
|
+
const { handleSubmit, handleReset } = useForm({
|
|
384
|
+
validationSchema: {
|
|
385
|
+
name(value: string) {
|
|
386
|
+
if (!value) return 'Обязательно для заполнения';
|
|
387
|
+
if (value.length < 3) return 'Минимальное кол-во символов 3';
|
|
388
|
+
if (value.length > 10) return 'Максимальное кол-во символов 10';
|
|
389
|
+
return true;
|
|
390
|
+
},
|
|
391
|
+
phone(value: string) {
|
|
392
|
+
if (!value) return 'Обязательно для заполнения';
|
|
393
|
+
if (value.length < 8) return 'Минимальное кол-во символов 8';
|
|
394
|
+
if (value.length > 9) return 'Максимальное кол-во символов 9';
|
|
395
|
+
return true;
|
|
396
|
+
},
|
|
397
|
+
email(value: string) {
|
|
398
|
+
if (!value) return 'Обязательно для заполнения';
|
|
399
|
+
if (!/^[a-z.-]+@[a-z.-]+\.[a-z]+$/i.test(value)) return 'Некорректный E-mail';
|
|
400
|
+
return true;
|
|
401
|
+
},
|
|
402
|
+
checkbox(value: boolean) {
|
|
403
|
+
if (!value) return 'Обязательно для заполнения';
|
|
404
|
+
return true;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
const name = useField('name');
|
|
410
|
+
const phone = useField('phone');
|
|
411
|
+
const email = useField('email');
|
|
412
|
+
const checkbox = useField('checkbox');
|
|
413
|
+
|
|
414
|
+
const result = ref('');
|
|
415
|
+
|
|
416
|
+
const submit = handleSubmit((values) => {
|
|
417
|
+
result.value = `Отправлено: ${JSON.stringify(values)}`;
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
const clear = () => {
|
|
421
|
+
handleReset();
|
|
422
|
+
result.value = '';
|
|
423
|
+
};
|
|
424
|
+
</script>
|
|
425
|
+
|
|
426
|
+
<template>
|
|
427
|
+
<CdsForm class="flex flex-col gap-2 w-[350px] m-auto" @submit.prevent="submit">
|
|
428
|
+
<CdsTextInput
|
|
429
|
+
v-model="name.value.value"
|
|
430
|
+
:error-messages="name.errorMessage.value"
|
|
431
|
+
label="Имя"
|
|
432
|
+
placeholder="Введите имя"
|
|
433
|
+
/>
|
|
434
|
+
<CdsTextInput
|
|
435
|
+
v-model="phone.value.value"
|
|
436
|
+
:error-messages="phone.errorMessage.value"
|
|
437
|
+
label="Номер телефона"
|
|
438
|
+
placeholder="Введите номер"
|
|
439
|
+
/>
|
|
440
|
+
<CdsTextInput
|
|
441
|
+
v-model="email.value.value"
|
|
442
|
+
:error-messages="email.errorMessage.value"
|
|
443
|
+
label="E-mail"
|
|
444
|
+
placeholder="Введите E-mail"
|
|
445
|
+
/>
|
|
446
|
+
<CdsCheckbox
|
|
447
|
+
v-model="checkbox.value.value"
|
|
448
|
+
:error-messages="checkbox.errorMessage.value"
|
|
449
|
+
value="1"
|
|
450
|
+
label="Согласен с условиями"
|
|
451
|
+
/>
|
|
452
|
+
<div class="flex gap-2">
|
|
453
|
+
<CdsButton type="submit">Отправить</CdsButton>
|
|
454
|
+
<CdsButton appearance="secondary" @click="clear">Очистить</CdsButton>
|
|
455
|
+
</div>
|
|
456
|
+
<div v-if="result" class="text-sm text-content-secondary break-all">{{ result }}</div>
|
|
457
|
+
</CdsForm>
|
|
458
|
+
</template>
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
## Vuelidate
|
|
462
|
+
|
|
463
|
+
With [vuelidate](https://vuelidate-next.netlify.app/) the rules are declared declaratively, and the field errors are passed into `error-messages` in the same way.
|
|
464
|
+
|
|
465
|
+
**Example (SFC):**
|
|
466
|
+
|
|
467
|
+
```vue
|
|
468
|
+
<script setup lang="ts">
|
|
469
|
+
import { CdsButton, CdsCheckbox, CdsForm, CdsTextInput } from '@central-design-system/components';
|
|
470
|
+
import { useVuelidate } from '@vuelidate/core';
|
|
471
|
+
import { email, maxLength, minLength, required } from '@vuelidate/validators';
|
|
472
|
+
import { reactive, ref, unref } from 'vue';
|
|
473
|
+
|
|
474
|
+
const initialState = {
|
|
475
|
+
name: '',
|
|
476
|
+
email: '',
|
|
477
|
+
phone: '',
|
|
478
|
+
checkbox: null as boolean | null
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
const state = reactive({ ...initialState });
|
|
482
|
+
const result = ref('');
|
|
483
|
+
|
|
484
|
+
const rules = {
|
|
485
|
+
name: { required },
|
|
486
|
+
phone: { required, minLength: minLength(8), maxLength: maxLength(9) },
|
|
487
|
+
email: { required, email },
|
|
488
|
+
checkbox: { required }
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
const v$ = useVuelidate(rules, state);
|
|
492
|
+
|
|
493
|
+
const clear = () => {
|
|
494
|
+
v$.value.$reset();
|
|
495
|
+
result.value = '';
|
|
496
|
+
|
|
497
|
+
for (const [key, value] of Object.entries(initialState)) {
|
|
498
|
+
(state as Record<string, any>)[key] = value;
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
|
|
502
|
+
const submit = () => {
|
|
503
|
+
if (v$.value.$invalid) {
|
|
504
|
+
v$.value.$touch();
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
result.value = `Отправлено: ${JSON.stringify(state)}`;
|
|
509
|
+
};
|
|
510
|
+
</script>
|
|
511
|
+
|
|
512
|
+
<template>
|
|
513
|
+
<CdsForm class="flex flex-col gap-2 w-[350px] m-auto" @submit.prevent="submit">
|
|
514
|
+
<CdsTextInput
|
|
515
|
+
v-model="state.name"
|
|
516
|
+
:error-messages="v$.name.$errors.map((e) => unref(e.$message))"
|
|
517
|
+
label="Имя"
|
|
518
|
+
placeholder="Введите имя"
|
|
519
|
+
@input="v$.name.$touch()"
|
|
520
|
+
@blur="v$.name.$touch()"
|
|
521
|
+
/>
|
|
522
|
+
<CdsTextInput
|
|
523
|
+
v-model="state.phone"
|
|
524
|
+
:error-messages="v$.phone.$errors.map((e) => unref(e.$message))"
|
|
525
|
+
label="Номер телефона"
|
|
526
|
+
placeholder="Введите номер"
|
|
527
|
+
@input="v$.phone.$touch()"
|
|
528
|
+
@blur="v$.phone.$touch()"
|
|
529
|
+
/>
|
|
530
|
+
<CdsTextInput
|
|
531
|
+
v-model="state.email"
|
|
532
|
+
:error-messages="v$.email.$errors.map((e) => unref(e.$message))"
|
|
533
|
+
label="E-mail"
|
|
534
|
+
placeholder="Введите E-mail"
|
|
535
|
+
@input="v$.email.$touch()"
|
|
536
|
+
@blur="v$.email.$touch()"
|
|
537
|
+
/>
|
|
538
|
+
<CdsCheckbox
|
|
539
|
+
v-model="state.checkbox"
|
|
540
|
+
:error-messages="v$.checkbox.$errors.map((e) => unref(e.$message))"
|
|
541
|
+
label="Согласен с условиями"
|
|
542
|
+
@change="v$.checkbox.$touch()"
|
|
543
|
+
@blur="v$.checkbox.$touch()"
|
|
544
|
+
/>
|
|
545
|
+
<div class="flex gap-2">
|
|
546
|
+
<CdsButton type="submit">Отправить</CdsButton>
|
|
547
|
+
<CdsButton appearance="secondary" @click="clear">Очистить</CdsButton>
|
|
548
|
+
</div>
|
|
549
|
+
<div v-if="result" class="text-sm text-content-secondary break-all">{{ result }}</div>
|
|
550
|
+
</CdsForm>
|
|
551
|
+
</template>
|
|
552
|
+
```
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# CdsForm — 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
|
+
| The heading and the description explain what the form is and what happens after submission. | A set of fields without context makes the user guess why they are filling them in. |
|
|
9
|
+
| Show an error after the input or on submission — while a field is untouched the form stays silent. | A form that complains before the user's first action looks broken. |
|
|
10
|
+
| The submit button names the action — it is clear what happens after the click. | A faceless “OK” says nothing about what the form will do. |
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# CdsForm — 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
|
+
## _CdsForm.variables.scss
|
|
8
|
+
|
|
9
|
+
```scss
|
|
10
|
+
@use '../../../styles/tools';
|
|
11
|
+
|
|
12
|
+
$form-label-gap: var(--cds-spacing-100) !default;
|
|
13
|
+
$form-description-gap: var(--cds-spacing-200) !default;
|
|
14
|
+
$form-description-color: rgb(var(--cds-color-content-secondary)) !default;
|
|
15
|
+
```
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# CdsFunctionalButton — API
|
|
2
|
+
|
|
3
|
+
> Generated from meta.json by `bun run generate:skill`. Do not edit manually.
|
|
4
|
+
> Examples: [examples.md](examples.md) · Guidelines: [guidelines.md](guidelines.md) · Tokens: [tokens.md](tokens.md)
|
|
5
|
+
|
|
6
|
+
A functional button is a utility action next to the content: download a file in a row of a list, reveal a password in a field, collapse a block, open the menu of a record. It is a [CdsButton](../cds-button/api.md) with `size="sm"` and `appearance="tertiary"` fixed in place: the background is transparent and appears only on hover, so the button does not compete for attention with the content it stands next to.
|
|
7
|
+
|
|
8
|
+
## CdsFunctionalButton
|
|
9
|
+
|
|
10
|
+
**Props**
|
|
11
|
+
|
|
12
|
+
| Prop | Type | Default | Required | Description |
|
|
13
|
+
| --- | --- | --- | --- | --- |
|
|
14
|
+
| `activeColor` | `string \| undefined` | — | no | Color of the component in its active state |
|
|
15
|
+
| `baseColor` | `string \| undefined` | — | no | Color of the component in its inactive state |
|
|
16
|
+
| `color` | `string \| undefined` | — | no | Component color |
|
|
17
|
+
| `disabled` | `boolean \| null \| undefined` | `null` | no | Disabled state |
|
|
18
|
+
| `exact` | `boolean \| undefined` | — | no | If true, the active state applies only on an exact route match |
|
|
19
|
+
| `href` | `string \| undefined` | — | no | The `href` attribute of the link. When set, the component behaves as a regular link |
|
|
20
|
+
| `icon` | `IconValue \| undefined` | — | no | Icon |
|
|
21
|
+
| `loading` | `string \| boolean \| undefined` | — | no | Loading indicator for the component |
|
|
22
|
+
| `readonly` | `boolean \| null \| undefined` | `null` | no | Read-only state |
|
|
23
|
+
| `replace` | `boolean \| undefined` | — | no | If true, navigation replaces the current history entry instead of pushing a new one |
|
|
24
|
+
| `tag` | `string \| JSXComponent<any> \| undefined` | `'button'` | no | Custom HTML tag or component to render |
|
|
25
|
+
| `textColor` | `string \| undefined` | — | no | Text color of the component |
|
|
26
|
+
| `theme` | `string \| undefined` | — | no | Component theme |
|
|
27
|
+
| `to` | `LinkTo \| undefined` | — | no | Target route or route location object for RouterLink. When set, the component behaves as a RouterLink |
|
|
28
|
+
|
|
29
|
+
**Slots**
|
|
30
|
+
|
|
31
|
+
| Name | Type | Description |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| `default` | `any` | Content inside the button |
|
|
34
|
+
| `loader` | `any` | Loading indicator |
|