@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,263 @@
|
|
|
1
|
+
---
|
|
2
|
+
sourceHash: 2d02d03da0e4d6f0fcb171775b7b88784a216ac0
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Display & Platform
|
|
6
|
+
|
|
7
|
+
Central Design System exposes reactive information about the **screen**
|
|
8
|
+
(breakpoints, viewport size, mobile mode) and the **platform** (browser, OS,
|
|
9
|
+
device type) through a single composable — `useDisplay`. Breakpoints are the same
|
|
10
|
+
in JavaScript and in styles (the `cds-breakpoint-*` SCSS mixins), so responsive
|
|
11
|
+
logic in script and CSS always agrees.
|
|
12
|
+
|
|
13
|
+
## Breakpoints
|
|
14
|
+
|
|
15
|
+
| Breakpoint | Width range (px) | Start width | Grid columns |
|
|
16
|
+
| --- | --- | --- | --- |
|
|
17
|
+
| `xs` | `0 … 671` | `0` | 4 |
|
|
18
|
+
| `sm` | `672 … 1055` | `672` | 8 |
|
|
19
|
+
| `md` | `1056 … 1311` | `1056` | 16 |
|
|
20
|
+
| `lg` | `1312 … 1583` | `1312` | 16 |
|
|
21
|
+
| `xl` | `1584 … ∞` | `1584` | 16 |
|
|
22
|
+
|
|
23
|
+
The values have a single source:
|
|
24
|
+
|
|
25
|
+
- JS — `defaultDisplayOptions.thresholds` (`src/composables/useDisplay/internal/useDisplay.constants.ts`);
|
|
26
|
+
- SCSS — `$grid-breakpoints` (`src/styles/utilities/grid/_config.scss`).
|
|
27
|
+
|
|
28
|
+
## In JavaScript — `useDisplay`
|
|
29
|
+
|
|
30
|
+
The `useDisplay` composable returns the reactive state of the screen and the
|
|
31
|
+
platform. It works out of the box as long as the application is initialized
|
|
32
|
+
through `createCds` (which provides `cds:display`).
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { useDisplay } from '@central-design-system/components';
|
|
36
|
+
|
|
37
|
+
const display = useDisplay();
|
|
38
|
+
|
|
39
|
+
display.width.value; // current viewport width, px
|
|
40
|
+
display.name.value; // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
|
|
41
|
+
display.mobile.value; // true when width < mobileBreakpoint ('sm' by default)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Available flags
|
|
45
|
+
|
|
46
|
+
| Flag | Meaning |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| `xs` / `sm` / `md` / `lg` / `xl` | exactly one is active — the current breakpoint |
|
|
49
|
+
| `smUp` / `mdUp` / `lgUp` / `xlUp` | width ≥ the breakpoint's start width ("and up") |
|
|
50
|
+
| `smDown` / `mdDown` / `lgDown` / `xlDown` | the breakpoint and everything below it ("and down") |
|
|
51
|
+
| `name` | name of the current breakpoint |
|
|
52
|
+
| `mobile` | mobile mode (based on `mobileBreakpoint`) |
|
|
53
|
+
| `mobileBreakpoint` | current mobile mode threshold |
|
|
54
|
+
| `width` / `height` | viewport size, px |
|
|
55
|
+
| `thresholds` | current threshold map |
|
|
56
|
+
| `platform` | platform/browser flags (see [Platform](#platform)) |
|
|
57
|
+
| `update()` | force a recalculation of size and platform |
|
|
58
|
+
|
|
59
|
+
For example, `mdUp` is true when `width ≥ 1056`, and `smDown` when `width < 1056`
|
|
60
|
+
(that is, it covers the `xs` and `sm` ranges).
|
|
61
|
+
|
|
62
|
+
### Example in a component
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { useDisplay } from '@central-design-system/components';
|
|
66
|
+
|
|
67
|
+
const { mobile, mdUp } = useDisplay();
|
|
68
|
+
|
|
69
|
+
defineRender(() => (
|
|
70
|
+
<div class={{ 'is-mobile': mobile.value }}>
|
|
71
|
+
{mdUp.value ? <DesktopLayout /> : <MobileLayout />}
|
|
72
|
+
</div>
|
|
73
|
+
));
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Mobile mode at the prop level
|
|
77
|
+
|
|
78
|
+
Components that mix in `defineDisplayProps()` accept the `mobile` and
|
|
79
|
+
`mobileBreakpoint` props — use them to override the mobile mode threshold
|
|
80
|
+
locally:
|
|
81
|
+
|
|
82
|
+
```html
|
|
83
|
+
<!-- Mobile mode kicks in below 1056px (md) instead of the global 'sm' -->
|
|
84
|
+
<CdsSlideGroup mobile-breakpoint="md" />
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Overriding the thresholds globally
|
|
88
|
+
|
|
89
|
+
Thresholds and `mobileBreakpoint` are configured at initialization:
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import { createCds } from '@central-design-system/components';
|
|
93
|
+
|
|
94
|
+
app.use(createCds({
|
|
95
|
+
display: {
|
|
96
|
+
mobileBreakpoint: 'md',
|
|
97
|
+
thresholds: { xs: 0, sm: 600, md: 960, lg: 1280, xl: 1920 }
|
|
98
|
+
}
|
|
99
|
+
}));
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
> If you change the thresholds in JS, keep them in sync in SCSS
|
|
103
|
+
> (`$grid-breakpoints`) — otherwise responsiveness in script and styles will
|
|
104
|
+
> drift apart.
|
|
105
|
+
|
|
106
|
+
## In SCSS — the `cds-breakpoint-*` mixins
|
|
107
|
+
|
|
108
|
+
The mixins come from a public entry point:
|
|
109
|
+
|
|
110
|
+
```scss
|
|
111
|
+
@use '@central-design-system/components/styles/breakpoints' as breakpoint;
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
> In plain Dart Sass (without a bundler), use the pkg scheme and the Node
|
|
115
|
+
> importer:
|
|
116
|
+
> `@use 'pkg:@central-design-system/components/styles/breakpoints' as breakpoint;`.
|
|
117
|
+
|
|
118
|
+
### `cds-breakpoint-up($name)` — "and up"
|
|
119
|
+
|
|
120
|
+
```scss
|
|
121
|
+
.card {
|
|
122
|
+
display: none;
|
|
123
|
+
|
|
124
|
+
// applies at min-width: 1056px (md and up)
|
|
125
|
+
@include breakpoint.cds-breakpoint-up(md) {
|
|
126
|
+
display: block;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### `cds-breakpoint-down($name)` — "and down"
|
|
132
|
+
|
|
133
|
+
```scss
|
|
134
|
+
.sidebar {
|
|
135
|
+
// applies at max-width: 1055.98px — that is, on sm and xs
|
|
136
|
+
@include breakpoint.cds-breakpoint-down(sm) {
|
|
137
|
+
display: none;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`cds-breakpoint-down('<name>')` covers the breakpoint itself **and everything
|
|
143
|
+
below it** (the upper bound is the start of the next breakpoint minus `0.02px`).
|
|
144
|
+
No media query is generated for the largest breakpoint (`xl`) — "xl and down" is
|
|
145
|
+
every width.
|
|
146
|
+
|
|
147
|
+
### `cds-breakpoint-between($lower, $upper)` — a range
|
|
148
|
+
|
|
149
|
+
```scss
|
|
150
|
+
.banner {
|
|
151
|
+
// min-width: 672px and max-width: 1056px
|
|
152
|
+
@include breakpoint.cds-breakpoint-between(sm, md) {
|
|
153
|
+
padding: 16px;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Both mixins also accept a number instead of a name: `cds-breakpoint-up(900px)`.
|
|
159
|
+
|
|
160
|
+
### Other mixins and functions
|
|
161
|
+
|
|
162
|
+
- `cds-breakpoint($name)` — an alias for `cds-breakpoint-up`.
|
|
163
|
+
- `cds-largest-breakpoint` — media query for the largest breakpoint.
|
|
164
|
+
- `breakpoint-next($name)` / `breakpoint-prev($name)` — the neighboring breakpoint.
|
|
165
|
+
- `is-smallest-breakpoint($name)` — whether `$name` is the smallest one.
|
|
166
|
+
- `largest-breakpoint-name()` — name of the largest breakpoint.
|
|
167
|
+
|
|
168
|
+
## JS ↔ CSS correspondence
|
|
169
|
+
|
|
170
|
+
The `useDisplay` flags and the mixins' media queries cover identical width
|
|
171
|
+
ranges — that's what lets you write consistent responsive logic in script and
|
|
172
|
+
styles.
|
|
173
|
+
|
|
174
|
+
| JS (`useDisplay`) | SCSS mixin | Width range |
|
|
175
|
+
| --- | --- | --- |
|
|
176
|
+
| `smUp` | `cds-breakpoint-up(sm)` | `≥ 672` |
|
|
177
|
+
| `mdUp` | `cds-breakpoint-up(md)` | `≥ 1056` |
|
|
178
|
+
| `lgUp` | `cds-breakpoint-up(lg)` | `≥ 1312` |
|
|
179
|
+
| `xlUp` | `cds-breakpoint-up(xl)` | `≥ 1584` |
|
|
180
|
+
| `smDown` | `cds-breakpoint-down(sm)` | `< 1056` |
|
|
181
|
+
| `mdDown` | `cds-breakpoint-down(md)` | `< 1312` |
|
|
182
|
+
| `lgDown` | `cds-breakpoint-down(lg)` | `< 1584` |
|
|
183
|
+
| `xlDown` | `cds-breakpoint-down(xl)` | every width |
|
|
184
|
+
|
|
185
|
+
> **Important (migrating from CDS 3).** In CDS 3 the semantics of
|
|
186
|
+
> `cds-breakpoint-down` in SCSS differed from JS: `down('sm')` meant "strictly
|
|
187
|
+
> below `sm`" (only `xs`), whereas `smDown` in JS means "`sm` and down". In CDS 4
|
|
188
|
+
> the CSS is aligned with JS: `down('<name>')` now always means "`<name>` and
|
|
189
|
+
> down". If you are porting styles from CDS 3, shift the `down()` argument one
|
|
190
|
+
> step down (old `down('md')` ⇒ new `down('sm')`).
|
|
191
|
+
> See the Migration Guide.
|
|
192
|
+
|
|
193
|
+
## Platform
|
|
194
|
+
|
|
195
|
+
`useDisplay().platform` is a reactive object with device, OS and browser flags.
|
|
196
|
+
Detection is based on `navigator.userAgent` and touch support.
|
|
197
|
+
|
|
198
|
+
```ts
|
|
199
|
+
import { useDisplay } from '@central-design-system/components';
|
|
200
|
+
|
|
201
|
+
const { platform } = useDisplay();
|
|
202
|
+
|
|
203
|
+
if (platform.value.ios) {
|
|
204
|
+
// special behavior for iOS
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const isTouchDevice = platform.value.touch;
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Fields of the `platform` object
|
|
211
|
+
|
|
212
|
+
Every field is a `boolean`.
|
|
213
|
+
|
|
214
|
+
| Field | Meaning |
|
|
215
|
+
| --- | --- |
|
|
216
|
+
| `android` | an Android device |
|
|
217
|
+
| `ios` | an iOS device (iPhone / iPad / iPod) |
|
|
218
|
+
| `cordova` | the app runs in Cordova |
|
|
219
|
+
| `electron` | the app runs in Electron |
|
|
220
|
+
| `chrome` | Chrome browser |
|
|
221
|
+
| `edge` | Edge browser |
|
|
222
|
+
| `firefox` | Firefox browser |
|
|
223
|
+
| `opera` | Opera browser |
|
|
224
|
+
| `win` | Windows OS |
|
|
225
|
+
| `mac` | macOS |
|
|
226
|
+
| `linux` | Linux OS |
|
|
227
|
+
| `touch` | the device supports touch |
|
|
228
|
+
| `ssr` | the value was computed on the server (SSR) |
|
|
229
|
+
|
|
230
|
+
### Example: a class on the app root
|
|
231
|
+
|
|
232
|
+
```tsx
|
|
233
|
+
import { useDisplay } from '@central-design-system/components';
|
|
234
|
+
|
|
235
|
+
const { platform } = useDisplay();
|
|
236
|
+
|
|
237
|
+
defineRender(() => (
|
|
238
|
+
<div
|
|
239
|
+
class={{
|
|
240
|
+
'platform--ios': platform.value.ios,
|
|
241
|
+
'platform--android': platform.value.android,
|
|
242
|
+
'platform--touch': platform.value.touch
|
|
243
|
+
}}
|
|
244
|
+
>
|
|
245
|
+
<slot />
|
|
246
|
+
</div>
|
|
247
|
+
));
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
> **Careful with user-agent sniffing.** Detecting the browser or OS from
|
|
251
|
+
> `userAgent` is unreliable (the string can be spoofed, and new browsers may not
|
|
252
|
+
> be recognized). Use `platform` for progressive enhancement — say, a fix
|
|
253
|
+
> specific to iOS Safari — not as the only gate in front of a feature. For
|
|
254
|
+
> feature detection, prefer capability checks (`'ontouchstart' in window` and the
|
|
255
|
+
> like).
|
|
256
|
+
|
|
257
|
+
### SSR
|
|
258
|
+
|
|
259
|
+
During server-side rendering `userAgent` is unavailable, so `platform.ssr === true`
|
|
260
|
+
and the rest of the flags are `false`. After hydration the values can be
|
|
261
|
+
recalculated by calling `display.update()` (which recalculates both size and
|
|
262
|
+
platform). Initial sizes for SSR are set through the second argument of
|
|
263
|
+
`createDisplay(options, ssr)` or the `ssr` option in `createCds`.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Forms with CDS 4
|
|
2
|
+
|
|
3
|
+
## Ready-made controls
|
|
4
|
+
|
|
5
|
+
For typical forms use the ready-made "molecules" (each has its own `api.md`
|
|
6
|
+
and `examples.md` in `references/components/`):
|
|
7
|
+
|
|
8
|
+
| Control | Purpose |
|
|
9
|
+
| --- | --- |
|
|
10
|
+
| [CdsTextInput](../components/cds-text-input/api.md) | Text field with label / description / messages |
|
|
11
|
+
| [CdsSelect](../components/cds-select/api.md) | Dropdown (single / multiple) |
|
|
12
|
+
| [CdsAutocomplete](../components/cds-autocomplete/api.md) | Selection with search over the list |
|
|
13
|
+
| [CdsCombobox](../components/cds-combobox/api.md) | Selection that also accepts free-form input |
|
|
14
|
+
| [CdsCheckbox](../components/cds-checkbox/api.md) | Checkbox |
|
|
15
|
+
| [CdsRadioGroup](../components/cds-radio-group/api.md) | Radio button group |
|
|
16
|
+
| [CdsToggle](../components/cds-toggle/api.md) | Toggle |
|
|
17
|
+
| [CdsDatePicker](../components/cds-date-picker/api.md) / [CdsTimePicker](../components/cds-time-picker/api.md) | Date / time |
|
|
18
|
+
|
|
19
|
+
## CdsForm: aggregation and validation
|
|
20
|
+
|
|
21
|
+
`CdsForm` groups fields, aggregates their validation (`v-model` — form
|
|
22
|
+
validity) and exposes `validate` / `reset` / `resetValidation` methods via
|
|
23
|
+
slot props and the exposed API. Validation rules are set on the fields with
|
|
24
|
+
the `rules` prop (an array of functions `value → true | 'error text'`).
|
|
25
|
+
|
|
26
|
+
A verified example (from Storybook):
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<CdsForm v-model="valid" @submit.prevent>
|
|
30
|
+
<template #default="{ reset }">
|
|
31
|
+
<CdsTextInput v-model="name" :rules="rules.name" label="Name" placeholder="Enter name" />
|
|
32
|
+
<CdsTextInput v-model="email" :rules="rules.email" label="Email" placeholder="Enter Email" />
|
|
33
|
+
<CdsButton appearance="secondary" @click="reset">Clear</CdsButton>
|
|
34
|
+
<CdsButton type="submit">Submit</CdsButton>
|
|
35
|
+
</template>
|
|
36
|
+
</CdsForm>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
const valid = ref(false);
|
|
41
|
+
const name = ref('');
|
|
42
|
+
const email = ref('');
|
|
43
|
+
|
|
44
|
+
const rules = {
|
|
45
|
+
name: [
|
|
46
|
+
(value: string) => !!value || 'Must not be empty',
|
|
47
|
+
(value: string) => value.length <= 10 || 'No more than 10 characters'
|
|
48
|
+
],
|
|
49
|
+
email: [
|
|
50
|
+
(value: string) => !!value || 'Must not be empty',
|
|
51
|
+
(value: string) => /.+@.+\..+/.test(value) || 'Invalid format'
|
|
52
|
+
]
|
|
53
|
+
};
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Useful modes (full list in [api.md](../components/cds-form/api.md)):
|
|
57
|
+
|
|
58
|
+
- `first-fail` — validation stops at the first invalid field;
|
|
59
|
+
- `disabled` / `readonly` on the form propagate to every nested field.
|
|
60
|
+
|
|
61
|
+
CdsForm also works with external validators (vuelidate, vee-validate) — see
|
|
62
|
+
[examples.md](../components/cds-form/examples.md).
|
|
63
|
+
|
|
64
|
+
## Building your own field from atoms
|
|
65
|
+
|
|
66
|
+
When no ready-made molecule fits, assemble the field from atoms:
|
|
67
|
+
|
|
68
|
+
| Atom | Role |
|
|
69
|
+
| --- | --- |
|
|
70
|
+
| [CdsField](../components/cds-field/api.md) | Field wrapper: wires up label/control/messages, states |
|
|
71
|
+
| [CdsLabel](../components/cds-label/api.md) | Field label |
|
|
72
|
+
| [CdsDescription](../components/cds-description/api.md) | Supporting description |
|
|
73
|
+
| [CdsMessages](../components/cds-messages/api.md) | Error messages / hints |
|
|
74
|
+
| [CdsInput](../components/cds-input/api.md) | Bare input control |
|
|
75
|
+
|
|
76
|
+
Before assembling, open the `api.md` of every atom — take the set of props
|
|
77
|
+
and slots only from there.
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
---
|
|
2
|
+
sourceHash: 49864e870f2f989420a5ebf7ffc7eb1a3458124a
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Global configuration
|
|
6
|
+
|
|
7
|
+
CDS 4 lets you set default prop values — globally, for a specific component, or
|
|
8
|
+
only inside a given subtree. You describe "what buttons look like in our product"
|
|
9
|
+
once and stop repeating the same props in every template.
|
|
10
|
+
|
|
11
|
+
## Setup
|
|
12
|
+
|
|
13
|
+
Default values are set through the `defaults` option of `createCds`. The `global`
|
|
14
|
+
key affects every component; a key named after a component affects only that one.
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
import { createApp } from 'vue';
|
|
18
|
+
import '@central-design-system/components/styles';
|
|
19
|
+
import { createCds, components, directives } from '@central-design-system/components';
|
|
20
|
+
|
|
21
|
+
import App from './App.vue';
|
|
22
|
+
|
|
23
|
+
const cds = createCds({
|
|
24
|
+
components,
|
|
25
|
+
directives,
|
|
26
|
+
defaults: {
|
|
27
|
+
global: {
|
|
28
|
+
size: 'sm'
|
|
29
|
+
},
|
|
30
|
+
CdsButton: {
|
|
31
|
+
appearance: 'secondary'
|
|
32
|
+
},
|
|
33
|
+
CdsTextInput: {
|
|
34
|
+
hideDetails: 'auto'
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
createApp(App).use(cds);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Important.** Props in `defaults` are written in camelCase: `hideDetails`, not
|
|
43
|
+
`hide-details`.
|
|
44
|
+
|
|
45
|
+
A component key is its name from `defineOptions({ name })` — `CdsButton`,
|
|
46
|
+
`CdsTextInput`, `CdsCardActions` and so on. Subcomponent names (`CdsCardTitle`,
|
|
47
|
+
`CdsListItem`) work exactly like root component names.
|
|
48
|
+
|
|
49
|
+
### Resolution order
|
|
50
|
+
|
|
51
|
+
For every prop, CDS takes the first value that applies:
|
|
52
|
+
|
|
53
|
+
1. the prop explicitly passed in the template;
|
|
54
|
+
2. `defaults.<ComponentName>.<prop>` from the nearest defaults context;
|
|
55
|
+
3. `defaults.global.<prop>`;
|
|
56
|
+
4. the default value declared in the component itself.
|
|
57
|
+
|
|
58
|
+
An explicitly passed prop always wins — defaults can never override the template.
|
|
59
|
+
|
|
60
|
+
### Changing defaults at runtime
|
|
61
|
+
|
|
62
|
+
`createCds` returns an instance whose defaults live in a reactive ref. You can
|
|
63
|
+
change them on the fly — every mounted component recalculates:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
const cds = createCds({ components, directives });
|
|
67
|
+
|
|
68
|
+
// for example, turn on compact mode based on a user setting
|
|
69
|
+
cds.defaults.value = {
|
|
70
|
+
...cds.defaults.value,
|
|
71
|
+
global: { size: 'sm' }
|
|
72
|
+
};
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Contextual defaults
|
|
76
|
+
|
|
77
|
+
Defaults can be set for components nested inside another component. For example,
|
|
78
|
+
to make every button inside a card secondary by default:
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
createCds({
|
|
82
|
+
defaults: {
|
|
83
|
+
CdsCard: {
|
|
84
|
+
CdsButton: { appearance: 'secondary' }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The rule is simple: a capitalized key is the name of a nested component, a
|
|
91
|
+
lowercase key is a prop of the current component. Nesting is not limited to one
|
|
92
|
+
level:
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
createCds({
|
|
96
|
+
defaults: {
|
|
97
|
+
CdsCard: {
|
|
98
|
+
CdsCardActions: {
|
|
99
|
+
CdsButton: { appearance: 'tertiary', size: 'sm' }
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The library uses the same mechanism internally so that grouping components can
|
|
107
|
+
hand their settings down to their children:
|
|
108
|
+
|
|
109
|
+
- `CdsButtonGroup` sets the `appearance`, `color`, `baseColor`, `size` props on nested `CdsButton`s;
|
|
110
|
+
- `CdsTagGroup` sets the `color`, `activeColor`, `disabled`, `filter` props on `CdsTag`;
|
|
111
|
+
- `CdsSelectionControlGroup` passes settings to the controls, with the target component name
|
|
112
|
+
set by the `defaultsTarget` prop (`CdsCheckbox`, `CdsRadio` and so on);
|
|
113
|
+
- `CdsTabs`, `CdsSteps`, `CdsList`, `CdsBreadcrumbs`, `CdsButtonToggle`,
|
|
114
|
+
`CdsExpandablePanels`, `CdsOtpInput` work the same way.
|
|
115
|
+
|
|
116
|
+
That's why `<CdsButtonGroup size="sm">` makes every button inside small — you
|
|
117
|
+
don't have to set `size` on each of them.
|
|
118
|
+
|
|
119
|
+
## Global class and style
|
|
120
|
+
|
|
121
|
+
Besides props, a component's defaults can carry `class` and `style`. It's a
|
|
122
|
+
convenient way to apply product-specific rules to every instance of a component
|
|
123
|
+
without touching the templates:
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
createCds({
|
|
127
|
+
defaults: {
|
|
128
|
+
CdsButton: {
|
|
129
|
+
class: 'my-button'
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Any value Vue accepts works — a string, an object, an array:
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
createCds({
|
|
139
|
+
defaults: {
|
|
140
|
+
CdsButton: {
|
|
141
|
+
style: [{ textTransform: 'none' }]
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Unlike ordinary props, `class` and `style` are not overwritten by the template
|
|
148
|
+
but **merged** with it. So `<CdsButton class="mt-2">` gets both `my-button` and
|
|
149
|
+
`mt-2`.
|
|
150
|
+
|
|
151
|
+
**Important.** `class` and `style` only work under a specific component's key. In
|
|
152
|
+
`global` they are ignored.
|
|
153
|
+
|
|
154
|
+
## Aliases
|
|
155
|
+
|
|
156
|
+
An alias is the same component registered under a different name with its own
|
|
157
|
+
defaults. Aliases are a handy way to assemble "product" variants of components.
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
import { createCds, components, directives, CdsButton } from '@central-design-system/components';
|
|
161
|
+
|
|
162
|
+
const cds = createCds({
|
|
163
|
+
components,
|
|
164
|
+
directives,
|
|
165
|
+
aliases: {
|
|
166
|
+
CdsButtonPrimary: CdsButton,
|
|
167
|
+
CdsButtonDanger: CdsButton
|
|
168
|
+
},
|
|
169
|
+
defaults: {
|
|
170
|
+
CdsButtonPrimary: {
|
|
171
|
+
appearance: 'primary',
|
|
172
|
+
class: 'my-button--primary'
|
|
173
|
+
},
|
|
174
|
+
CdsButtonDanger: {
|
|
175
|
+
appearance: 'primary',
|
|
176
|
+
color: 'red',
|
|
177
|
+
class: 'my-button--danger'
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Aliases are registered globally, so you can use them in templates right away:
|
|
184
|
+
|
|
185
|
+
```vue
|
|
186
|
+
<template>
|
|
187
|
+
<CdsButtonPrimary>Save</CdsButtonPrimary>
|
|
188
|
+
<CdsButtonDanger class="ml-2">Delete</CdsButtonDanger>
|
|
189
|
+
</template>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Important.** An alias does not inherit the base component's defaults. If the
|
|
193
|
+
configuration has `defaults.CdsButton`, it will not apply to `<CdsButtonPrimary>`
|
|
194
|
+
— defaults are looked up by the alias name. Move shared settings into `global` or
|
|
195
|
+
duplicate them under the alias key.
|
|
196
|
+
|
|
197
|
+
## Defaults for part of the application
|
|
198
|
+
|
|
199
|
+
To set defaults for a subtree rather than globally, use the
|
|
200
|
+
`CdsDefaultsProvider` component. The Controls panel in Storybook is built on it
|
|
201
|
+
too: the values from the panel are applied to the example's components as
|
|
202
|
+
defaults.
|
|
203
|
+
|
|
204
|
+
```vue
|
|
205
|
+
<script setup lang="ts">
|
|
206
|
+
import { CdsButton, CdsDefaultsProvider } from '@central-design-system/components';
|
|
207
|
+
</script>
|
|
208
|
+
|
|
209
|
+
<template>
|
|
210
|
+
<CdsDefaultsProvider :defaults="{ CdsButton: { appearance: 'tertiary', size: 'sm' } }">
|
|
211
|
+
<CdsButton>Small tertiary button</CdsButton>
|
|
212
|
+
</CdsDefaultsProvider>
|
|
213
|
+
</template>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
| Prop | Type | Purpose |
|
|
217
|
+
| ---------- | ------------------- | -------------------------------------------------------------------------------------------- |
|
|
218
|
+
| `defaults` | `DefaultsOptions` | Defaults for the subtree; merged with the inherited ones by default |
|
|
219
|
+
| `scoped` | `boolean` | Don't mix with the parent defaults — only the ones set here apply |
|
|
220
|
+
| `reset` | `number \| string` | Go N levels up the defaults chain |
|
|
221
|
+
| `root` | `boolean \| string` | Fall back to the root defaults from `createCds`; with a string — to a named group inside them |
|
|
222
|
+
| `disabled` | `boolean` | Provide nothing — the subtree gets the parent defaults as they are |
|
|
223
|
+
|
|
224
|
+
The typical use for `scoped` is an "island" inside someone else's environment:
|
|
225
|
+
enclosing groups (`CdsButtonGroup`, say) should not impose their settings on your
|
|
226
|
+
block.
|
|
227
|
+
|
|
228
|
+
## Your own components
|
|
229
|
+
|
|
230
|
+
Your application's own components can take part in the defaults system too. Pass
|
|
231
|
+
their props through `useDefaults`:
|
|
232
|
+
|
|
233
|
+
```vue
|
|
234
|
+
<script setup lang="ts">
|
|
235
|
+
import { useDefaults } from '@central-design-system/components';
|
|
236
|
+
|
|
237
|
+
const _props = defineProps<{ foo?: string }>();
|
|
238
|
+
const props = useDefaults(_props, 'MyComponent');
|
|
239
|
+
</script>
|
|
240
|
+
|
|
241
|
+
<template>
|
|
242
|
+
<div>I am {{ props.foo }}</div>
|
|
243
|
+
</template>
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
`useDefaults` takes two arguments, both optional:
|
|
247
|
+
|
|
248
|
+
- `props` — the props object returned by `defineProps`;
|
|
249
|
+
- `name` — the component name used to look up the key in `defaults`. If omitted,
|
|
250
|
+
the name from `defineOptions({ name })` is used, and failing that, the file name.
|
|
251
|
+
|
|
252
|
+
Now the component is configurable from the shared configuration:
|
|
253
|
+
|
|
254
|
+
```ts
|
|
255
|
+
createCds({
|
|
256
|
+
defaults: {
|
|
257
|
+
MyComponent: { foo: 'bar' }
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Important.** In the template, refer to `props.foo`, not `foo`. `useDefaults`
|
|
263
|
+
returns a proxy over the props, and destructured `defineProps` variables bypass
|
|
264
|
+
it:
|
|
265
|
+
|
|
266
|
+
```diff
|
|
267
|
+
-<div>I am {{ foo }}</div>
|
|
268
|
+
+<div>I am {{ props.foo }}</div>
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### Nested defaults in your own components
|
|
272
|
+
|
|
273
|
+
To make your component hand defaults down to its children (the way
|
|
274
|
+
`CdsButtonGroup` does), just call `useDefaults()` with no arguments — the nested
|
|
275
|
+
keys from its `defaults` section go into the child context:
|
|
276
|
+
|
|
277
|
+
```vue
|
|
278
|
+
<script setup lang="ts">
|
|
279
|
+
import { useDefaults } from '@central-design-system/components';
|
|
280
|
+
|
|
281
|
+
useDefaults();
|
|
282
|
+
</script>
|
|
283
|
+
|
|
284
|
+
<template>
|
|
285
|
+
<div class="my-panel">
|
|
286
|
+
<slot />
|
|
287
|
+
</div>
|
|
288
|
+
</template>
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
```ts
|
|
292
|
+
createCds({
|
|
293
|
+
defaults: {
|
|
294
|
+
MyPanel: {
|
|
295
|
+
CdsButton: { appearance: 'tertiary' }
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
If the children's defaults depend on the component's props, use `provideDefaults`
|
|
302
|
+
directly:
|
|
303
|
+
|
|
304
|
+
```vue
|
|
305
|
+
<script setup lang="ts">
|
|
306
|
+
import { provideDefaults } from '@central-design-system/components';
|
|
307
|
+
import { toRef } from 'vue';
|
|
308
|
+
|
|
309
|
+
const props = defineProps<{ size?: 'sm' | 'md' }>();
|
|
310
|
+
|
|
311
|
+
provideDefaults({
|
|
312
|
+
CdsButton: {
|
|
313
|
+
size: toRef(() => props.size)
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
</script>
|
|
317
|
+
|
|
318
|
+
<template>
|
|
319
|
+
<div class="my-toolbar">
|
|
320
|
+
<slot />
|
|
321
|
+
</div>
|
|
322
|
+
</template>
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## Blueprint — a configuration preset
|
|
326
|
+
|
|
327
|
+
If several applications need the same set of options, extract it into a
|
|
328
|
+
`blueprint`: a plain `createCds` options object that the rest of the
|
|
329
|
+
configuration is layered on top of.
|
|
330
|
+
|
|
331
|
+
```ts
|
|
332
|
+
import { createCds, components, directives } from '@central-design-system/components';
|
|
333
|
+
import type { Blueprint } from '@central-design-system/components';
|
|
334
|
+
|
|
335
|
+
const productBlueprint: Blueprint = {
|
|
336
|
+
theme: { defaultTheme: 'b2bLight' },
|
|
337
|
+
defaults: {
|
|
338
|
+
CdsButton: { appearance: 'secondary' }
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
const cds = createCds({
|
|
343
|
+
blueprint: productBlueprint,
|
|
344
|
+
components,
|
|
345
|
+
directives,
|
|
346
|
+
// overrides the value from the blueprint
|
|
347
|
+
defaults: {
|
|
348
|
+
CdsButton: { size: 'sm' }
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Options are merged deeply (`mergeDeep`), so in the example above the buttons keep
|
|
354
|
+
`appearance: 'secondary'` from the preset and gain `size: 'sm'`.
|