@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,343 @@
|
|
|
1
|
+
---
|
|
2
|
+
sourceHash: 41872192eda1479740145bb7f4bcb9dbb28f0462
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Theming
|
|
6
|
+
|
|
7
|
+
The design system lets you switch themes or configure your own theme
|
|
8
|
+
programmatically, including at runtime.
|
|
9
|
+
|
|
10
|
+
## How it works
|
|
11
|
+
|
|
12
|
+
A theme in CDS 4 is a set of **semantic tokens** that are turned into CSS
|
|
13
|
+
variables when the application starts:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
ThemeDefinition (TS) → --cds-color-* / --cds-* (CSS variables) → component styles
|
|
17
|
+
↓
|
|
18
|
+
@theme (Tailwind CSS v4) → bg-surface-primary, rounded-200, …
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Colors are written into the variables as **RGB channels** rather than finished
|
|
22
|
+
colors — that's what makes opacity control possible:
|
|
23
|
+
|
|
24
|
+
```css
|
|
25
|
+
/* generated by CDS */
|
|
26
|
+
:root {
|
|
27
|
+
--cds-color-brand-primary: 0,90,178;
|
|
28
|
+
--cds-color-surface-primary: 255,255,255;
|
|
29
|
+
--cds-spacing-400: 1rem;
|
|
30
|
+
--cds-border-radius-200: 0.25rem;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* usage */
|
|
34
|
+
.my-block {
|
|
35
|
+
background: rgb(var(--cds-color-surface-primary));
|
|
36
|
+
border: var(--cds-border-100) solid rgb(var(--cds-color-brand-primary) / 0.4);
|
|
37
|
+
padding: var(--cds-spacing-400);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Theme styles are injected into `<style id="cds-theme-stylesheet">` and are
|
|
42
|
+
recalculated reactively when the theme changes.
|
|
43
|
+
|
|
44
|
+
## Enabling a theme
|
|
45
|
+
|
|
46
|
+
CDS 4 ships eight ready-made themes:
|
|
47
|
+
|
|
48
|
+
| Theme | Description |
|
|
49
|
+
| ------------- |-----------------------------------------|
|
|
50
|
+
| `cdsLight` | light theme, used by default |
|
|
51
|
+
| `cdsDark` | dark theme |
|
|
52
|
+
| `b2bLight` | light theme for B2B-Center applications |
|
|
53
|
+
| `b2bDark` | dark theme for B2B-Center applications |
|
|
54
|
+
| `lumaLight` | light Luma theme |
|
|
55
|
+
| `lumaDark` | dark Luma theme |
|
|
56
|
+
| `promoLight` | light promo theme |
|
|
57
|
+
| `promoDark` | dark promo theme |
|
|
58
|
+
|
|
59
|
+
> `cdsLight` is used by default — you don't need to enable it.
|
|
60
|
+
|
|
61
|
+
To switch to another theme, pass its name in the `createCds` options:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { createApp } from 'vue';
|
|
65
|
+
import '@central-design-system/components/styles';
|
|
66
|
+
import { createCds, components, directives } from '@central-design-system/components';
|
|
67
|
+
|
|
68
|
+
import App from './App.vue';
|
|
69
|
+
|
|
70
|
+
const cds = createCds({
|
|
71
|
+
components,
|
|
72
|
+
directives,
|
|
73
|
+
theme: {
|
|
74
|
+
defaultTheme: 'b2bLight'
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
createApp(App).use(cds);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Theming options
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
createCds({
|
|
85
|
+
theme: {
|
|
86
|
+
defaultTheme: 'cdsLight',
|
|
87
|
+
prefix: 'cds',
|
|
88
|
+
themes: {},
|
|
89
|
+
variations: false,
|
|
90
|
+
utilities: true,
|
|
91
|
+
legacyClasses: false,
|
|
92
|
+
scoped: false,
|
|
93
|
+
scope: undefined,
|
|
94
|
+
stylesheetId: 'cds-theme-stylesheet',
|
|
95
|
+
cspNonce: undefined
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
| Option | Type | Default | Purpose |
|
|
101
|
+
| --------------- | ---------------------------------------------------------- | ----------------------- | -------------------------------------------------------------------------- |
|
|
102
|
+
| `defaultTheme` | `ThemeName \| string` | `'cdsLight'` | Theme active at startup |
|
|
103
|
+
| `prefix` | `string` | `'cds'` | Prefix of the generated CSS variables (`--cds-color-*`) |
|
|
104
|
+
| `themes` | `Record<string, ThemeDefinition>` | built-in themes | Your own themes; merged with the built-in ones |
|
|
105
|
+
| `variations` | `false \| { colors: string[]; lighten: number; darken: number }` | `false` | Auto-generation of lighter/darker color variations |
|
|
106
|
+
| `utilities` | `boolean` | `true` | Generation of background/text utility classes from theme tokens |
|
|
107
|
+
| `legacyClasses` | `boolean` | `false` | CDS 3 legacy classes (`cds-bg-*`, `cds-text-*`, `cds-border-*`) |
|
|
108
|
+
| `scoped` | `boolean` | `false` | Don't write the variables into `:root` |
|
|
109
|
+
| `scope` | `string` | — | Limit theme selectors to a subtree (`:where(<scope>)`) |
|
|
110
|
+
| `stylesheetId` | `string` | `'cds-theme-stylesheet'`| `id` of the `<style>` tag holding the theme |
|
|
111
|
+
| `cspNonce` | `string` | — | `nonce` for Content Security Policy |
|
|
112
|
+
|
|
113
|
+
## Creating your own theme
|
|
114
|
+
|
|
115
|
+
A custom theme is a `ThemeDefinition` object with the fields `dark`, `colors` and
|
|
116
|
+
`variables`. You only need to specify the **overrides**: missing tokens are
|
|
117
|
+
inherited from `cdsLight` / `cdsDark`.
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { createApp } from 'vue';
|
|
121
|
+
import { createCds, components, directives } from '@central-design-system/components';
|
|
122
|
+
|
|
123
|
+
import type { ThemeDefinition } from '@central-design-system/components';
|
|
124
|
+
|
|
125
|
+
import App from './App.vue';
|
|
126
|
+
|
|
127
|
+
const myCustomGreenTheme: ThemeDefinition = {
|
|
128
|
+
dark: false,
|
|
129
|
+
colors: {
|
|
130
|
+
// Main brand colors of the new theme
|
|
131
|
+
'brand-primary': '#2C8926',
|
|
132
|
+
'brand-primary-hover': '#3C9C2C',
|
|
133
|
+
'brand-primary-active': '#50A946',
|
|
134
|
+
'brand-primary-border': '#2C8926',
|
|
135
|
+
'brand-primary-content': '#005005',
|
|
136
|
+
'brand-secondary': '#DCF5D0',
|
|
137
|
+
'brand-secondary-hover': '#A5DD98',
|
|
138
|
+
'brand-secondary-active': '#97D283',
|
|
139
|
+
'brand-secondary-border': '#BCE8AB',
|
|
140
|
+
// Surfaces
|
|
141
|
+
'page-primary': '#F2F8F0',
|
|
142
|
+
'surface-secondary': '#E8F3E4'
|
|
143
|
+
},
|
|
144
|
+
// Variables: typography, spacing, radii, shadows
|
|
145
|
+
variables: {
|
|
146
|
+
'font-family': 'Roboto, sans-serif',
|
|
147
|
+
'border-radius-200': '0.625rem'
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const cds = createCds({
|
|
152
|
+
components,
|
|
153
|
+
directives,
|
|
154
|
+
theme: {
|
|
155
|
+
defaultTheme: 'myCustomGreenTheme',
|
|
156
|
+
themes: {
|
|
157
|
+
myCustomGreenTheme
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
createApp(App).use(cds);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Every registered theme also gets a `.cds-theme--<name>` class — use it to enable
|
|
166
|
+
the theme on an arbitrary part of the markup.
|
|
167
|
+
|
|
168
|
+
### Token groups
|
|
169
|
+
|
|
170
|
+
`colors` — semantic colors:
|
|
171
|
+
|
|
172
|
+
- `brand-*` — brand (`primary`, `secondary` and their `hover` / `active` / `border` / `content`)
|
|
173
|
+
- `surface-*`, `page-*`, `fill-*` — surfaces and fills
|
|
174
|
+
- `content-*` — text, icons, links
|
|
175
|
+
- `line-*` — borders, dividers, focus and selection
|
|
176
|
+
- `status-{success,warning,progress,info,danger,indication}-*` — statuses
|
|
177
|
+
- `other-*` — additional accent palettes
|
|
178
|
+
|
|
179
|
+
`variables` — dimensions: `spacing-*`, `font-size-*`, `font-line-height-*`,
|
|
180
|
+
`font-weight-*`, `border-*`, `border-radius-*`, `shadow-{x,y,blur}-*`,
|
|
181
|
+
`font-family`, `base-unit`.
|
|
182
|
+
|
|
183
|
+
For the full token list of a specific theme, see the package sources:
|
|
184
|
+
`@central-design-system/components/src/themes/cdsLight.ts`.
|
|
185
|
+
|
|
186
|
+
## Switching the theme
|
|
187
|
+
|
|
188
|
+
You can change the theme at runtime through the `useTheme` composable:
|
|
189
|
+
|
|
190
|
+
```vue
|
|
191
|
+
<script setup lang="ts">
|
|
192
|
+
import { useTheme } from '@central-design-system/components';
|
|
193
|
+
|
|
194
|
+
const theme = useTheme();
|
|
195
|
+
|
|
196
|
+
function toggleTheme(): void {
|
|
197
|
+
theme.global.name.value = theme.global.current.value.dark ? 'cdsLight' : 'cdsDark';
|
|
198
|
+
}
|
|
199
|
+
</script>
|
|
200
|
+
|
|
201
|
+
<template>
|
|
202
|
+
<cds-button @click="toggleTheme">Toggle theme</cds-button>
|
|
203
|
+
</template>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
You can also change the theme of a single component by passing it the `theme`
|
|
207
|
+
prop. Keep in mind that the theme applies not only to the component itself but to
|
|
208
|
+
everything nested inside it:
|
|
209
|
+
|
|
210
|
+
```vue
|
|
211
|
+
<template>
|
|
212
|
+
<cds-notification theme="b2bLight">
|
|
213
|
+
<!-- the button will use the b2bLight theme -->
|
|
214
|
+
<cds-button>Button</cds-button>
|
|
215
|
+
</cds-notification>
|
|
216
|
+
</template>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
The `theme` prop is supported by container components and most visual components:
|
|
220
|
+
`CdsApp`, `CdsLayout`, `CdsPage`, `CdsSurface`, `CdsCard`, `CdsDrawer`,
|
|
221
|
+
`CdsModal`, `CdsOverlay`, `CdsButton`, `CdsField`, `CdsTable` and others.
|
|
222
|
+
|
|
223
|
+
## Using theme tokens in your own code
|
|
224
|
+
|
|
225
|
+
### Tailwind CSS v4
|
|
226
|
+
|
|
227
|
+
Theme tokens are mapped into Tailwind's `@theme`, so utilities switch along with
|
|
228
|
+
the theme automatically:
|
|
229
|
+
|
|
230
|
+
```html
|
|
231
|
+
<div class="bg-surface-primary text-content-primary p-4 rounded-200">…</div>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Setup is described in [Tailwind CSS v4 + CDS 4](./tailwindcss.md).
|
|
235
|
+
|
|
236
|
+
### CSS / SCSS
|
|
237
|
+
|
|
238
|
+
```scss
|
|
239
|
+
.my-card {
|
|
240
|
+
background: rgb(var(--cds-color-surface-elevated));
|
|
241
|
+
color: rgb(var(--cds-color-content-primary));
|
|
242
|
+
padding: var(--cds-spacing-500);
|
|
243
|
+
border-radius: var(--cds-border-radius-300);
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
When you override CDS component styles, put them into the `cds-overrides` layer —
|
|
248
|
+
that way they are guaranteed to win over the library's styles:
|
|
249
|
+
|
|
250
|
+
```scss
|
|
251
|
+
@layer cds-overrides {
|
|
252
|
+
.cds-button {
|
|
253
|
+
border-radius: var(--cds-border-radius-300);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### CDS 3 legacy classes
|
|
259
|
+
|
|
260
|
+
The CDS 3 utility classes (`cds-bg-*`, `cds-text-*`, `cds-border-*`) are **off by
|
|
261
|
+
default** in CDS 4. To bring them back for the duration of a migration:
|
|
262
|
+
|
|
263
|
+
```ts
|
|
264
|
+
import '@central-design-system/components/styles/legacy';
|
|
265
|
+
|
|
266
|
+
const cds = createCds({
|
|
267
|
+
theme: { legacyClasses: true }
|
|
268
|
+
});
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Disabling theming
|
|
272
|
+
|
|
273
|
+
Pass `false` to the `theme` option. This prevents the generation of CSS variables
|
|
274
|
+
and theme classes and disables runtime theme switching — the `<style>` tag is not
|
|
275
|
+
created at all.
|
|
276
|
+
|
|
277
|
+
```ts
|
|
278
|
+
import { createCds } from '@central-design-system/components';
|
|
279
|
+
|
|
280
|
+
const cds = createCds({
|
|
281
|
+
theme: false
|
|
282
|
+
});
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
With theming disabled, `theme.isDisabled === true` and `themeClasses` returns
|
|
286
|
+
`undefined`.
|
|
287
|
+
|
|
288
|
+
## Theme instance interface
|
|
289
|
+
|
|
290
|
+
`useTheme()` returns a `ThemeInstance` — access to the current theme and its
|
|
291
|
+
settings.
|
|
292
|
+
|
|
293
|
+
```ts
|
|
294
|
+
interface ThemeInstance {
|
|
295
|
+
/** Whether theming is enabled (`false` with `theme: false`) */
|
|
296
|
+
readonly isDisabled: boolean;
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Raw object of the installed themes
|
|
300
|
+
* Themes can be added and modified
|
|
301
|
+
*/
|
|
302
|
+
readonly themes: Ref<Record<string, InternalThemeDefinition>>;
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Name of the current theme
|
|
306
|
+
* Inherited from the parent component
|
|
307
|
+
*/
|
|
308
|
+
readonly name: Readonly<Ref<string>>;
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Processed object of the current theme
|
|
312
|
+
* Includes the automatically generated colors
|
|
313
|
+
*/
|
|
314
|
+
readonly current: DeepReadonly<Ref<InternalThemeDefinition>>;
|
|
315
|
+
readonly computedThemes: DeepReadonly<Ref<Record<string, InternalThemeDefinition>>>;
|
|
316
|
+
|
|
317
|
+
/** Class of the current theme — `cds-theme--<name>` */
|
|
318
|
+
readonly themeClasses: Readonly<ComputedRef<string | undefined>>;
|
|
319
|
+
|
|
320
|
+
/** Generated CSS of the current theme */
|
|
321
|
+
readonly styles: Readonly<ComputedRef<string>>;
|
|
322
|
+
|
|
323
|
+
readonly global: {
|
|
324
|
+
/** Name of the current global theme in the application (writable) */
|
|
325
|
+
readonly name: Ref<string>;
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Processed object of the current global theme in the application
|
|
329
|
+
* Also available from `theme.computedThemes.value[theme.global.name.value]`
|
|
330
|
+
*/
|
|
331
|
+
readonly current: DeepReadonly<Ref<InternalThemeDefinition>>;
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
The theme instance is also available on the object returned by `createCds()` —
|
|
337
|
+
handy outside of a component context:
|
|
338
|
+
|
|
339
|
+
```ts
|
|
340
|
+
const cds = createCds({ theme: { defaultTheme: 'cdsLight' } });
|
|
341
|
+
|
|
342
|
+
cds.theme.global.name.value = 'cdsDark';
|
|
343
|
+
```
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
sourceHash: b1ba0f5864509842881b42ebf6cfb46aadcba96f
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Tree-shaking
|
|
6
|
+
|
|
7
|
+
CDS 4 is published as an ESM bundle with its module structure preserved: every
|
|
8
|
+
component is a separate chunk with its own CSS next to it. That lets the bundler
|
|
9
|
+
(Vite, webpack, Rollup) drop everything your application doesn't use.
|
|
10
|
+
|
|
11
|
+
For this to work, follow two rules:
|
|
12
|
+
|
|
13
|
+
1. **Register only the components you actually need in `createCds`.**
|
|
14
|
+
2. **Include the base styles selectively** rather than the whole `styles.css`.
|
|
15
|
+
|
|
16
|
+
Below is how to do that and how much it saves.
|
|
17
|
+
|
|
18
|
+
## How it works
|
|
19
|
+
|
|
20
|
+
- The ESM bundle is built with `chunkSplitPlugin({ strategy: 'unbundle' })` — the
|
|
21
|
+
library's module structure is preserved and components are not glued into a
|
|
22
|
+
single file.
|
|
23
|
+
- `package.json` declares `sideEffects`, so the bundler knows the library's JS
|
|
24
|
+
modules are pure and safe to remove.
|
|
25
|
+
- During the build, each component's chunk gets an import of its own CSS
|
|
26
|
+
appended. That's why `import { CdsButton }` pulls in exactly `CdsButton.css`,
|
|
27
|
+
not the styles of the entire library.
|
|
28
|
+
|
|
29
|
+
No special build or plugin is required — ordinary named imports are enough.
|
|
30
|
+
|
|
31
|
+
## Selective component registration
|
|
32
|
+
|
|
33
|
+
Pass only the components you use to `createCds`:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { createApp } from 'vue';
|
|
37
|
+
|
|
38
|
+
import '@central-design-system/components/styles/common.css';
|
|
39
|
+
import { createCds, CdsButton, CdsCard, CdsIcon } from '@central-design-system/components';
|
|
40
|
+
|
|
41
|
+
import App from './App.vue';
|
|
42
|
+
|
|
43
|
+
const cds = createCds({
|
|
44
|
+
components: { CdsButton, CdsCard, CdsIcon }
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
createApp(App).use(cds).mount('#app');
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Components registered this way are available in templates globally — just as with
|
|
51
|
+
full registration:
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<template>
|
|
55
|
+
<CdsCard>
|
|
56
|
+
<CdsButton>Click me</CdsButton>
|
|
57
|
+
</CdsCard>
|
|
58
|
+
</template>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
> **Important:** `createCds` does not register components on its own. The set is
|
|
62
|
+
> always defined by the caller. That's deliberate: if the factory referenced the
|
|
63
|
+
> full component list, the bundler could not remove a single one of them.
|
|
64
|
+
|
|
65
|
+
### Alternative: a local import in an SFC
|
|
66
|
+
|
|
67
|
+
If you need a component in one or two places, global registration is optional —
|
|
68
|
+
import it right inside the component:
|
|
69
|
+
|
|
70
|
+
```html
|
|
71
|
+
<script setup lang="ts">
|
|
72
|
+
import { CdsButton } from '@central-design-system/components';
|
|
73
|
+
</script>
|
|
74
|
+
|
|
75
|
+
<template>
|
|
76
|
+
<CdsButton>Click me</CdsButton>
|
|
77
|
+
</template>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
You still need `createCds` in the entry point — it supplies themes, locales,
|
|
81
|
+
icons and breakpoints through `provide`. But you don't have to pass `components`
|
|
82
|
+
to it at all.
|
|
83
|
+
|
|
84
|
+
## Full registration
|
|
85
|
+
|
|
86
|
+
When the set of components is not known in advance (internal admin panels,
|
|
87
|
+
sandboxes, documentation), it's easier to register everything:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
import { createCds, components, directives } from '@central-design-system/components';
|
|
91
|
+
|
|
92
|
+
const cds = createCds({ components, directives });
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Such a call disables component tree-shaking: the `components` namespace import
|
|
96
|
+
keeps the whole library in the bundle.
|
|
97
|
+
|
|
98
|
+
## Styles
|
|
99
|
+
|
|
100
|
+
Component styles are included automatically along with the components themselves.
|
|
101
|
+
The only thing you have to include manually is the **base layer** — reset, fonts,
|
|
102
|
+
CSS layer order and global element styles:
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
import '@central-design-system/components/styles/common.css';
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
The base layer is mandatory: it's where the `@layer` order is declared, and the
|
|
109
|
+
correct cascade of component styles depends on it.
|
|
110
|
+
|
|
111
|
+
Take `common.css`, not `core.css`: `core.css` has no typography, so headings
|
|
112
|
+
(`h1`–`h6`) keep browser sizes instead of the CDS scale.
|
|
113
|
+
|
|
114
|
+
Available options:
|
|
115
|
+
|
|
116
|
+
| Import | Size | What's inside |
|
|
117
|
+
| --- | --- | --- |
|
|
118
|
+
| `styles/common.css` | ~9 KB | The recommended base: `core` + typography + grid utilities |
|
|
119
|
+
| `styles/core.css` | ~2 KB | Layers, fonts and reset only — **no typography** |
|
|
120
|
+
| `styles/tailwind.css` | ~12 KB | CDS tokens for Tailwind CSS v4 |
|
|
121
|
+
| `styles/legacy.css` | ~253 KB | Compatibility with legacy CDS 3 markup |
|
|
122
|
+
|
|
123
|
+
> **Don't use `@central-design-system/components/styles` in a tree-shaking
|
|
124
|
+
> scenario.** It's a ~556 KB aggregate containing the CSS of every component in
|
|
125
|
+
> the library. It's convenient for a quick start, but it completely defeats
|
|
126
|
+
> selective registration.
|
|
127
|
+
|
|
128
|
+
Color tokens (`--cds-color-*` and the rest) are not in the CSS files — they are
|
|
129
|
+
generated and injected into the document by `createCds` at runtime, based on the
|
|
130
|
+
active theme. There is nothing extra to include.
|
|
131
|
+
|
|
132
|
+
## Directives
|
|
133
|
+
|
|
134
|
+
Directives (`ClickOutside`, `Intersect`, `Touch`) are named exports and are
|
|
135
|
+
registered just as selectively:
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
import { createCds, ClickOutside } from '@central-design-system/components';
|
|
139
|
+
|
|
140
|
+
const cds = createCds({
|
|
141
|
+
components: { /* ... */ },
|
|
142
|
+
directives: { ClickOutside }
|
|
143
|
+
});
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The library's own components don't need you to register directives — the ones
|
|
147
|
+
that use `ClickOutside`, `Intersect` and `Touch` internally (`CdsOverlay` and
|
|
148
|
+
everything built on it: `CdsSelect`, `CdsMenu`, `CdsTooltip`, `CdsSlideView`,
|
|
149
|
+
input fields) import them themselves and register them locally. Pass `directives`
|
|
150
|
+
to `createCds` only for your own markup — `v-click-outside`, `v-intersect`,
|
|
151
|
+
`v-touch` in the application's templates.
|
|
152
|
+
|
|
153
|
+
> **In `4.0.0-alpha.0`:** local registration inside components didn't work, and
|
|
154
|
+
> the `CdsSelect` / `CdsMenu` menus wouldn't close on an outside click unless
|
|
155
|
+
> `directives` was passed to `createCds`. If you can't upgrade, add
|
|
156
|
+
> `directives: { ClickOutside, Touch }` to the registration.
|
|
157
|
+
|
|
158
|
+
## How much it saves
|
|
159
|
+
|
|
160
|
+
Measurements on Vite 5 (production, minified, styles in a separate file, Vue
|
|
161
|
+
included in the bundle, the base `common.css` not counted):
|
|
162
|
+
|
|
163
|
+
| Scenario | JS | JS (gzip) | CSS | CSS (gzip) |
|
|
164
|
+
| --- | --- | --- | --- | --- |
|
|
165
|
+
| Full registration (`components`, `directives`) | 625 KB | 203 KB | 208 KB | 24.6 KB |
|
|
166
|
+
| `createCds` + 3 components | 196 KB | 62.6 KB | 27.6 KB | 4.1 KB |
|
|
167
|
+
| `createCds` + 1 component | 162 KB | 51.4 KB | 12.6 KB | 1.9 KB |
|
|
168
|
+
| 1 component without `createCds` | 63 KB | 23.4 KB | 12.6 KB | 1.9 KB |
|
|
169
|
+
|
|
170
|
+
The numbers depend on which components exactly you include: composite components
|
|
171
|
+
(`CdsTable`, `CdsAutocomplete`, `CdsDatePicker`) pull in more dependencies than
|
|
172
|
+
atoms do.
|
|
173
|
+
|
|
174
|
+
### What isn't tree-shaken
|
|
175
|
+
|
|
176
|
+
About 99 KB is the core that `createCds` always includes: themes, locales, icons,
|
|
177
|
+
breakpoints (`useDisplay`), `goTo` and the `defaults` system. That volume doesn't
|
|
178
|
+
depend on the number of components — it is exactly the difference between the
|
|
179
|
+
"1 component without `createCds`" (63 KB) and "`createCds` + 1 component"
|
|
180
|
+
(162 KB) rows.
|
|
181
|
+
|
|
182
|
+
If CDS is used in a couple of places and you don't need the global subsystems,
|
|
183
|
+
you can skip `createCds` entirely. But then there are no themes, no locales and
|
|
184
|
+
no defaults, so that mode only suits pinpoint embeds.
|
|
185
|
+
|
|
186
|
+
## How to verify the result
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
npx vite-bundle-visualizer
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
What to look for:
|
|
193
|
+
|
|
194
|
+
- the bundle should contain no chunks of components missing from your `createCds`;
|
|
195
|
+
- if an "extra" component shows up, it is most likely imported transitively
|
|
196
|
+
(`CdsSelect` pulls in `CdsMenu` and `CdsList`, for instance) — that's normal;
|
|
197
|
+
- if the whole library ended up in the bundle, look for `components` or
|
|
198
|
+
`import * as` among your imports.
|
|
199
|
+
|
|
200
|
+
## Common mistakes
|
|
201
|
+
|
|
202
|
+
**A namespace import instead of a named one.** Any `import * as` from the library
|
|
203
|
+
keeps all of it:
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
// ❌ pulls in every component
|
|
207
|
+
import * as cdsComponents from '@central-design-system/components';
|
|
208
|
+
|
|
209
|
+
// ✅
|
|
210
|
+
import { CdsButton } from '@central-design-system/components';
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Importing icon packs through `iconsets`.** The `iconsets` object references all
|
|
214
|
+
packs at once, so it is not tree-shaken: the bundle gets the JS of every pack
|
|
215
|
+
(including `cds` — 46 KB) and, since UnoCSS scans them itself, the CSS of all five
|
|
216
|
+
packs (≈370 KB instead of ≈70 KB). Import the pack through its subpath:
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
// ❌ pulls in every pack
|
|
220
|
+
import { iconsets } from '@central-design-system/components';
|
|
221
|
+
const aliases = iconsets.remix.aliases;
|
|
222
|
+
|
|
223
|
+
// ✅ remix only
|
|
224
|
+
import { remix } from '@central-design-system/components/iconsets/remix';
|
|
225
|
+
const aliases = remix.aliases;
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Including the style aggregate.** `@central-design-system/components/styles`
|
|
229
|
+
contains the CSS of every component — use `styles/common.css`.
|
|
230
|
+
|
|
231
|
+
**Your own barrel re-export.** A `src/ui/index.ts` file that re-exports dozens of
|
|
232
|
+
CDS components kills tree-shaking if you import everything from it. Import
|
|
233
|
+
components directly from the library.
|
|
234
|
+
|
|
235
|
+
**A bundler without ESM support.** The CJS bundle (`dist/cjs`) and the IIFE build
|
|
236
|
+
are not tree-shakable by design. Make sure your bundler resolves the `import`
|
|
237
|
+
export condition — Vite, webpack 5 and Rollup do it by default.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Pattern: confirming an action in a modal
|
|
2
|
+
|
|
3
|
+
A modal interrupts the user's work, so it is justified only where you cannot
|
|
4
|
+
proceed without an answer: an irreversible action, a form, data loss. To report
|
|
5
|
+
the result of an action that already happened, a modal is not needed — that is
|
|
6
|
+
`CdsToast`.
|
|
7
|
+
|
|
8
|
+
## Confirming an irreversible action
|
|
9
|
+
|
|
10
|
+
```vue
|
|
11
|
+
<script setup lang="ts">
|
|
12
|
+
import { CdsButton, CdsModal } from '@central-design-system/components';
|
|
13
|
+
import { ref } from 'vue';
|
|
14
|
+
|
|
15
|
+
const open = ref(false);
|
|
16
|
+
const deleting = ref(false);
|
|
17
|
+
|
|
18
|
+
const confirm = async (): Promise<void> => {
|
|
19
|
+
deleting.value = true;
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
await api.removeDraft(draftId);
|
|
23
|
+
open.value = false;
|
|
24
|
+
} finally {
|
|
25
|
+
deleting.value = false;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<template>
|
|
31
|
+
<CdsButton appearance="tertiary" text="Delete draft" @click="open = true" />
|
|
32
|
+
|
|
33
|
+
<CdsModal v-model="open" persistent max-width="480">
|
|
34
|
+
<div class="flex flex-col gap-4 p-6">
|
|
35
|
+
<h2>Delete the draft?</h2>
|
|
36
|
+
<p>The draft and all unsaved changes will be deleted. This action cannot be undone.</p>
|
|
37
|
+
|
|
38
|
+
<div class="flex justify-end gap-3">
|
|
39
|
+
<CdsButton appearance="tertiary" text="Cancel" :disabled="deleting" @click="open = false" />
|
|
40
|
+
<CdsButton text="Delete" :loading="deleting" @click="confirm" />
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</CdsModal>
|
|
44
|
+
</template>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Key points:
|
|
48
|
+
|
|
49
|
+
- `persistent` — clicking outside the modal and `Esc` do not close it. Set it
|
|
50
|
+
only for irreversible actions and forms with entered data; for an ordinary
|
|
51
|
+
modal it is annoying.
|
|
52
|
+
- The modal closes **after** a successful server response, not immediately on
|
|
53
|
+
click: otherwise the user will never learn about an error.
|
|
54
|
+
- `:loading` on the confirm button guards against a repeated click, `:disabled`
|
|
55
|
+
on "Cancel" — against closing while the request is in flight.
|
|
56
|
+
|
|
57
|
+
## Opening via an activator
|
|
58
|
+
|
|
59
|
+
If a button exists only to open the modal, you can skip the state entirely —
|
|
60
|
+
`CdsModal` provides an `activator` slot:
|
|
61
|
+
|
|
62
|
+
```vue
|
|
63
|
+
<CdsModal max-width="480">
|
|
64
|
+
<template #activator="{ props }">
|
|
65
|
+
<CdsButton v-bind="props" text="Open" />
|
|
66
|
+
</template>
|
|
67
|
+
|
|
68
|
+
<template #default="{ isActive }">
|
|
69
|
+
<div class="p-6">
|
|
70
|
+
<CdsButton text="Close" @click="isActive.value = false" />
|
|
71
|
+
</div>
|
|
72
|
+
</template>
|
|
73
|
+
</CdsModal>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Copy
|
|
77
|
+
|
|
78
|
+
The title and the buttons name **the action and its outcome**, not "Yes" /
|
|
79
|
+
"OK": a "Yes" button gives the user no idea what will happen. A destructive
|
|
80
|
+
action is named directly — "Delete draft", not "Continue".
|
|
81
|
+
|
|
82
|
+
## What not to do
|
|
83
|
+
|
|
84
|
+
- Do not open a modal on top of a modal. If a second step is needed, put the
|
|
85
|
+
steps inside a single modal.
|
|
86
|
+
- Do not put a long form into a modal when it can live on a page.
|
|
87
|
+
- Do not use `CdsDrawer` as a "modal on the side": it is app-level side
|
|
88
|
+
navigation.
|
|
89
|
+
- Do not report success with a modal — that is what `CdsToast` is for.
|