@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,553 @@
|
|
|
1
|
+
# CdsUploader — usage examples
|
|
2
|
+
|
|
3
|
+
> Extracted from Storybook stories (`docs/*.stories.ts`) by `bun run generate:skill`. Do not edit manually.
|
|
4
|
+
> The full component contract is in [api.md](api.md). `v-bind="args"` in templates refers to the props from the **Args** block of the corresponding example.
|
|
5
|
+
|
|
6
|
+
The uploader sends files to the server right from the interface: the user picks them in the system dialog or drags them onto the button, and the component shows the list of what was uploaded — with a status, progress, downloading and removal. Every step of the file lifecycle comes with an event.
|
|
7
|
+
|
|
8
|
+
## The upload button
|
|
9
|
+
|
|
10
|
+
By default the upload is started by the primary "Загрузить файл" button with the `upload-icon` icon. The `button-props` prop passes any [CdsButton](../cds-button/api.md) props to the button, and the `default` slot replaces it entirely — the ready props of the button arrive in the `props` slot argument.
|
|
11
|
+
|
|
12
|
+
**Example (SFC):**
|
|
13
|
+
|
|
14
|
+
```vue
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
import type { NUploader } from '@central-design-system/components';
|
|
17
|
+
import { CdsButton, CdsUploader } from '@central-design-system/components';
|
|
18
|
+
import { ref } from 'vue';
|
|
19
|
+
|
|
20
|
+
const documents = ref<NUploader.IUploadFile[]>([]);
|
|
21
|
+
const photos = ref<NUploader.IUploadFile[]>([]);
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<template>
|
|
25
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
26
|
+
<CdsUploader
|
|
27
|
+
v-model="documents"
|
|
28
|
+
label="Свойства кнопки"
|
|
29
|
+
action="https://user1694090019726.requestly.dev/upload"
|
|
30
|
+
:button-props="{ appearance: 'secondary', text: 'Прикрепить файлы' }"
|
|
31
|
+
/>
|
|
32
|
+
|
|
33
|
+
<CdsUploader
|
|
34
|
+
v-model="photos"
|
|
35
|
+
label="Своя кнопка через слот"
|
|
36
|
+
action="https://user1694090019726.requestly.dev/upload"
|
|
37
|
+
>
|
|
38
|
+
<template #default="{ props }">
|
|
39
|
+
<CdsButton v-bind="props" appearance="tertiary" prepend-icon="add" text="Добавить фото" />
|
|
40
|
+
</template>
|
|
41
|
+
</CdsUploader>
|
|
42
|
+
</div>
|
|
43
|
+
</template>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Allowed file types
|
|
47
|
+
|
|
48
|
+
The `accept` prop limits the choice in the system dialog and filters out the unsuitable files on a drop — the rejected ones arrive in the `reject` event.
|
|
49
|
+
|
|
50
|
+
**Example (SFC):**
|
|
51
|
+
|
|
52
|
+
```vue
|
|
53
|
+
<script setup lang="ts">
|
|
54
|
+
import type { NUploader } from '@central-design-system/components';
|
|
55
|
+
import { CdsUploader } from '@central-design-system/components';
|
|
56
|
+
import { ref } from 'vue';
|
|
57
|
+
|
|
58
|
+
const files = ref<NUploader.IUploadFile[]>([]);
|
|
59
|
+
</script>
|
|
60
|
+
|
|
61
|
+
<template>
|
|
62
|
+
<div class="w-[350px] m-auto">
|
|
63
|
+
<CdsUploader
|
|
64
|
+
v-model="files"
|
|
65
|
+
label="Загрузка файла"
|
|
66
|
+
description="Подойдут только изображения jpeg, jpg или png"
|
|
67
|
+
action="https://user1694090019726.requestly.dev/upload"
|
|
68
|
+
accept="image/png, image/jpeg"
|
|
69
|
+
/>
|
|
70
|
+
</div>
|
|
71
|
+
</template>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## The file list
|
|
75
|
+
|
|
76
|
+
The list of the uploaded files lives in `v-model` — put the files received from the server into it and they will be shown right away. The `show-upload-list` prop controls the list: `false` hides it entirely, an object turns on the download and removal icons.
|
|
77
|
+
|
|
78
|
+
**Example (SFC):**
|
|
79
|
+
|
|
80
|
+
```vue
|
|
81
|
+
<script setup lang="ts">
|
|
82
|
+
import type { NUploader } from '@central-design-system/components';
|
|
83
|
+
import { CdsUploader } from '@central-design-system/components';
|
|
84
|
+
import { ref } from 'vue';
|
|
85
|
+
|
|
86
|
+
const files = ref<NUploader.IUploadFile[]>([
|
|
87
|
+
{
|
|
88
|
+
uid: '1',
|
|
89
|
+
name: 'dummy.pdf',
|
|
90
|
+
status: 'done',
|
|
91
|
+
url: 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
uid: '2',
|
|
95
|
+
name: 'B2b-elbcp-180x130.png',
|
|
96
|
+
status: 'done',
|
|
97
|
+
url: 'https://upload.wikimedia.org/wikipedia/commons/a/ae/B2b-elbcp-180x130.png'
|
|
98
|
+
}
|
|
99
|
+
]);
|
|
100
|
+
</script>
|
|
101
|
+
|
|
102
|
+
<template>
|
|
103
|
+
<div class="w-[350px] m-auto">
|
|
104
|
+
<CdsUploader
|
|
105
|
+
v-model="files"
|
|
106
|
+
label="Документы"
|
|
107
|
+
description="Уже загруженные файлы приходят через v-model"
|
|
108
|
+
action="https://user1694090019726.requestly.dev/upload"
|
|
109
|
+
:show-upload-list="{ showDownloadIcon: true, showRemoveIcon: true }"
|
|
110
|
+
/>
|
|
111
|
+
</div>
|
|
112
|
+
</template>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Number of files
|
|
116
|
+
|
|
117
|
+
The `max-count` prop limits the length of the list: with `max-count="1"` a new file replaces the previous one, with a larger limit the extra files are dropped.
|
|
118
|
+
|
|
119
|
+
**Example (SFC):**
|
|
120
|
+
|
|
121
|
+
```vue
|
|
122
|
+
<script setup lang="ts">
|
|
123
|
+
import type { NUploader } from '@central-design-system/components';
|
|
124
|
+
import { CdsUploader } from '@central-design-system/components';
|
|
125
|
+
import { ref } from 'vue';
|
|
126
|
+
|
|
127
|
+
const avatar = ref<NUploader.IUploadFile[]>([]);
|
|
128
|
+
const documents = ref<NUploader.IUploadFile[]>([]);
|
|
129
|
+
</script>
|
|
130
|
+
|
|
131
|
+
<template>
|
|
132
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
133
|
+
<CdsUploader
|
|
134
|
+
v-model="avatar"
|
|
135
|
+
label="Фото профиля"
|
|
136
|
+
description="Новый файл заменяет предыдущий"
|
|
137
|
+
action="https://user1694090019726.requestly.dev/upload"
|
|
138
|
+
accept="image/png, image/jpeg"
|
|
139
|
+
:max-count="1"
|
|
140
|
+
/>
|
|
141
|
+
|
|
142
|
+
<CdsUploader
|
|
143
|
+
v-model="documents"
|
|
144
|
+
label="Документы"
|
|
145
|
+
description="Не больше трёх файлов — лишние отбрасываются"
|
|
146
|
+
action="https://user1694090019726.requestly.dev/upload"
|
|
147
|
+
:max-count="3"
|
|
148
|
+
/>
|
|
149
|
+
</div>
|
|
150
|
+
</template>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Uploading directories
|
|
154
|
+
|
|
155
|
+
The `directory` prop turns on picking a whole folder — the files are collected from it recursively, on a drop as well.
|
|
156
|
+
|
|
157
|
+
**Example (SFC):**
|
|
158
|
+
|
|
159
|
+
```vue
|
|
160
|
+
<script setup lang="ts">
|
|
161
|
+
import type { NUploader } from '@central-design-system/components';
|
|
162
|
+
import { CdsButton, CdsUploader } from '@central-design-system/components';
|
|
163
|
+
import { ref } from 'vue';
|
|
164
|
+
|
|
165
|
+
const files = ref<NUploader.IUploadFile[]>([]);
|
|
166
|
+
</script>
|
|
167
|
+
|
|
168
|
+
<template>
|
|
169
|
+
<div class="w-[350px] m-auto">
|
|
170
|
+
<CdsUploader
|
|
171
|
+
v-model="files"
|
|
172
|
+
label="Загрузка директории"
|
|
173
|
+
description="Выберите папку — файлы соберутся из неё рекурсивно"
|
|
174
|
+
action="https://user1694090019726.requestly.dev/upload"
|
|
175
|
+
directory
|
|
176
|
+
>
|
|
177
|
+
<template #default="{ props }">
|
|
178
|
+
<CdsButton v-bind="props" text="Загрузить директорию" />
|
|
179
|
+
</template>
|
|
180
|
+
</CdsUploader>
|
|
181
|
+
</div>
|
|
182
|
+
</template>
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## States
|
|
186
|
+
|
|
187
|
+
`disabled` blocks the button and removes the removal icons from the list, `readonly` forbids changing the list but keeps the downloading.
|
|
188
|
+
|
|
189
|
+
**Example (SFC):**
|
|
190
|
+
|
|
191
|
+
```vue
|
|
192
|
+
<script setup lang="ts">
|
|
193
|
+
import type { NUploader } from '@central-design-system/components';
|
|
194
|
+
import { CdsUploader } from '@central-design-system/components';
|
|
195
|
+
|
|
196
|
+
const files: NUploader.IUploadFile[] = [
|
|
197
|
+
{
|
|
198
|
+
uid: '1',
|
|
199
|
+
name: 'dummy.pdf',
|
|
200
|
+
status: 'done',
|
|
201
|
+
url: 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'
|
|
202
|
+
}
|
|
203
|
+
];
|
|
204
|
+
</script>
|
|
205
|
+
|
|
206
|
+
<template>
|
|
207
|
+
<div class="flex flex-col gap-2 w-[350px] m-auto">
|
|
208
|
+
<CdsUploader label="Disabled" description="Загрузка недоступна" disabled />
|
|
209
|
+
|
|
210
|
+
<CdsUploader
|
|
211
|
+
label="Readonly"
|
|
212
|
+
description="Список нельзя изменить, скачивание работает"
|
|
213
|
+
:model-value="files"
|
|
214
|
+
:show-upload-list="{ showDownloadIcon: true }"
|
|
215
|
+
readonly
|
|
216
|
+
/>
|
|
217
|
+
</div>
|
|
218
|
+
</template>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Slots
|
|
222
|
+
|
|
223
|
+
When props are not enough, the content of any block is replaced by a slot.
|
|
224
|
+
|
|
225
|
+
**Example (SFC):**
|
|
226
|
+
|
|
227
|
+
```vue
|
|
228
|
+
<script setup lang="ts">
|
|
229
|
+
import type { NUploader } from '@central-design-system/components';
|
|
230
|
+
import {
|
|
231
|
+
CdsButton,
|
|
232
|
+
CdsFunctionalButton,
|
|
233
|
+
CdsIcon,
|
|
234
|
+
CdsListItem,
|
|
235
|
+
CdsTooltip,
|
|
236
|
+
CdsUploader
|
|
237
|
+
} from '@central-design-system/components';
|
|
238
|
+
import { ref } from 'vue';
|
|
239
|
+
|
|
240
|
+
const files = ref<NUploader.IUploadFile[]>([
|
|
241
|
+
{
|
|
242
|
+
uid: '1',
|
|
243
|
+
name: 'dummy.pdf',
|
|
244
|
+
status: 'done',
|
|
245
|
+
url: 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'
|
|
246
|
+
}
|
|
247
|
+
]);
|
|
248
|
+
|
|
249
|
+
const clearAll = () => {
|
|
250
|
+
files.value = [];
|
|
251
|
+
};
|
|
252
|
+
</script>
|
|
253
|
+
|
|
254
|
+
<template>
|
|
255
|
+
<div class="w-[350px] m-auto">
|
|
256
|
+
<CdsUploader v-model="files" action="https://user1694090019726.requestly.dev/upload">
|
|
257
|
+
<template #label>
|
|
258
|
+
<span class="flex items-center gap-0.5">
|
|
259
|
+
Загрузка файла
|
|
260
|
+
<CdsTooltip text="Дополнительная информация">
|
|
261
|
+
<template #activator="{ props }">
|
|
262
|
+
<CdsIcon name="info" v-bind="props" />
|
|
263
|
+
</template>
|
|
264
|
+
</CdsTooltip>
|
|
265
|
+
</span>
|
|
266
|
+
</template>
|
|
267
|
+
|
|
268
|
+
<template #description> Подойдёт любой формат — <strong>jpg, png, doc, zip</strong> — до 10 МБ. </template>
|
|
269
|
+
|
|
270
|
+
<template #default="{ props }">
|
|
271
|
+
<CdsButton v-bind="props" text="Выбрать файл" />
|
|
272
|
+
</template>
|
|
273
|
+
|
|
274
|
+
<template #append>
|
|
275
|
+
<CdsFunctionalButton icon="delete" aria-label="Удалить все файлы" @click="clearAll">
|
|
276
|
+
<CdsTooltip activator="parent">Удалить все файлы</CdsTooltip>
|
|
277
|
+
</CdsFunctionalButton>
|
|
278
|
+
</template>
|
|
279
|
+
|
|
280
|
+
<template #messages>Файлы проверяются после загрузки</template>
|
|
281
|
+
|
|
282
|
+
<template #itemRender="{ file, actions }">
|
|
283
|
+
<CdsListItem :title="file?.name">
|
|
284
|
+
<template #append>
|
|
285
|
+
<CdsFunctionalButton icon="download" aria-label="Скачать файл" @click="actions.download" />
|
|
286
|
+
<CdsFunctionalButton icon="delete" aria-label="Удалить файл" @click="actions.remove" />
|
|
287
|
+
</template>
|
|
288
|
+
</CdsListItem>
|
|
289
|
+
</template>
|
|
290
|
+
</CdsUploader>
|
|
291
|
+
</div>
|
|
292
|
+
</template>
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Deferred sending
|
|
296
|
+
|
|
297
|
+
The `before-upload` hook returning `false` turns the automatic sending off: the files pile up in the list, and the upload is started by a separate button in the `append` slot — together with the submission of the whole form, for example.
|
|
298
|
+
|
|
299
|
+
**Example (SFC):**
|
|
300
|
+
|
|
301
|
+
```vue
|
|
302
|
+
<script setup lang="ts">
|
|
303
|
+
import type { NUploader } from '@central-design-system/components';
|
|
304
|
+
import { CdsButton, CdsToast, CdsUploader } from '@central-design-system/components';
|
|
305
|
+
import { ref, unref } from 'vue';
|
|
306
|
+
|
|
307
|
+
const files = ref<NUploader.IUploadFile[]>([]);
|
|
308
|
+
const loading = ref(false);
|
|
309
|
+
const uploaded = ref(false);
|
|
310
|
+
|
|
311
|
+
const beforeUpload = (file: NUploader.IUploadFile): boolean => {
|
|
312
|
+
files.value = [...(unref(files) || []), file];
|
|
313
|
+
return false;
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
const handleUpload = async () => {
|
|
317
|
+
loading.value = true;
|
|
318
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
319
|
+
files.value = [];
|
|
320
|
+
loading.value = false;
|
|
321
|
+
uploaded.value = true;
|
|
322
|
+
};
|
|
323
|
+
</script>
|
|
324
|
+
|
|
325
|
+
<template>
|
|
326
|
+
<div class="w-[350px] m-auto">
|
|
327
|
+
<CdsUploader
|
|
328
|
+
v-model="files"
|
|
329
|
+
label="Выберите файлы"
|
|
330
|
+
description="Файлы копятся в списке, загрузку запускает кнопка"
|
|
331
|
+
:before-upload="beforeUpload"
|
|
332
|
+
:show-upload-list="{ showRemoveIcon: true }"
|
|
333
|
+
>
|
|
334
|
+
<template #default="{ props }">
|
|
335
|
+
<CdsButton appearance="secondary" text="Выбрать файлы" :disabled="props.disabled" :readonly="props.readonly" />
|
|
336
|
+
</template>
|
|
337
|
+
<template #append>
|
|
338
|
+
<CdsButton prepend-icon="upload" :loading="loading" :disabled="!files.length" @click="handleUpload">
|
|
339
|
+
Загрузить файлы
|
|
340
|
+
</CdsButton>
|
|
341
|
+
</template>
|
|
342
|
+
</CdsUploader>
|
|
343
|
+
<CdsToast v-model="uploaded" title="Файлы успешно загружены" status="success" />
|
|
344
|
+
</div>
|
|
345
|
+
</template>
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## A check before the upload
|
|
349
|
+
|
|
350
|
+
The same `before-upload` is the place for validation: return `false` and the file will not go to the server. A rejected file still gets into the list — remove it in the `change` handler and show the reason through `error-messages`.
|
|
351
|
+
|
|
352
|
+
**Example (SFC):**
|
|
353
|
+
|
|
354
|
+
```vue
|
|
355
|
+
<script setup lang="ts">
|
|
356
|
+
import type { NUploader } from '@central-design-system/components';
|
|
357
|
+
import { CdsUploader } from '@central-design-system/components';
|
|
358
|
+
import { ref } from 'vue';
|
|
359
|
+
|
|
360
|
+
const MAX_SIZE_MB = 5;
|
|
361
|
+
|
|
362
|
+
const files = ref<NUploader.IUploadFile[]>([]);
|
|
363
|
+
const errors = ref<string[]>([]);
|
|
364
|
+
|
|
365
|
+
const beforeUpload = (file: NUploader.IUploadFile): boolean => {
|
|
366
|
+
const valid = (file.size ?? 0) <= MAX_SIZE_MB * 1024 * 1024;
|
|
367
|
+
|
|
368
|
+
if (!valid) {
|
|
369
|
+
errors.value = [`«${file.name}» больше ${MAX_SIZE_MB} МБ`];
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return valid;
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
const handleChange = (info: NUploader.IUploadChangeParam<NUploader.IUploadFile> | Event) => {
|
|
376
|
+
if (info instanceof Event) return;
|
|
377
|
+
|
|
378
|
+
files.value = info.fileList.filter((file) => file.status);
|
|
379
|
+
};
|
|
380
|
+
</script>
|
|
381
|
+
|
|
382
|
+
<template>
|
|
383
|
+
<div class="w-[350px] m-auto">
|
|
384
|
+
<CdsUploader
|
|
385
|
+
v-model="files"
|
|
386
|
+
label="Вложения"
|
|
387
|
+
:description="`Любые файлы до ${MAX_SIZE_MB} МБ`"
|
|
388
|
+
action="https://user1694090019726.requestly.dev/upload"
|
|
389
|
+
:error-messages="errors"
|
|
390
|
+
:before-upload="beforeUpload"
|
|
391
|
+
@change="handleChange"
|
|
392
|
+
/>
|
|
393
|
+
</div>
|
|
394
|
+
</template>
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
## Upload errors
|
|
398
|
+
|
|
399
|
+
A file rejected by the server stays in the list with the error status. The `show-tooltip-with-error` prop shows the server response in a tooltip next to the status, and the `error` event lets you collect the messages under the field — here they pile up in `error-messages` and are reset when the file is removed.
|
|
400
|
+
|
|
401
|
+
**Example (SFC):**
|
|
402
|
+
|
|
403
|
+
```vue
|
|
404
|
+
<script setup lang="ts">
|
|
405
|
+
import type { NUploader } from '@central-design-system/components';
|
|
406
|
+
import { CdsUploader } from '@central-design-system/components';
|
|
407
|
+
import { ref } from 'vue';
|
|
408
|
+
|
|
409
|
+
const files = ref<NUploader.IUploadFile[]>([]);
|
|
410
|
+
const errors = ref<string[]>([]);
|
|
411
|
+
|
|
412
|
+
const handleError = (
|
|
413
|
+
_error: NUploader.IUploadRequestError | ProgressEvent,
|
|
414
|
+
response: { message?: string } | null,
|
|
415
|
+
file: NUploader.IUploadFile
|
|
416
|
+
) => {
|
|
417
|
+
errors.value = [...errors.value, `${response?.message ?? 'Ошибка сервера'}: ${file.name}`];
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
const handleRemove = () => {
|
|
421
|
+
errors.value = [];
|
|
422
|
+
};
|
|
423
|
+
</script>
|
|
424
|
+
|
|
425
|
+
<template>
|
|
426
|
+
<div class="w-[350px] m-auto">
|
|
427
|
+
<CdsUploader
|
|
428
|
+
v-model="files"
|
|
429
|
+
label="Загрузка с ошибкой"
|
|
430
|
+
description="Тестовый сервер отклоняет любой файл"
|
|
431
|
+
action="https://user1694090019726.requestly.dev/upload-error"
|
|
432
|
+
:error-messages="errors"
|
|
433
|
+
show-tooltip-with-error
|
|
434
|
+
@error="handleError"
|
|
435
|
+
@remove="handleRemove"
|
|
436
|
+
/>
|
|
437
|
+
</div>
|
|
438
|
+
</template>
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## Uploading without a server
|
|
442
|
+
|
|
443
|
+
The `custom-request` prop replaces the built-in XHR transport with your own function: it receives the file and the `onProgress`, `onSuccess`, `onError` callbacks and returns an object with an `abort` method. Here the upload is simulated with a timer — files can be sent through an SDK or a WebSocket in the same way.
|
|
444
|
+
|
|
445
|
+
**Example (SFC):**
|
|
446
|
+
|
|
447
|
+
```vue
|
|
448
|
+
<script setup lang="ts">
|
|
449
|
+
import type { NUploader } from '@central-design-system/components';
|
|
450
|
+
import { CdsUploader } from '@central-design-system/components';
|
|
451
|
+
import { ref } from 'vue';
|
|
452
|
+
|
|
453
|
+
const files = ref<NUploader.IUploadFile[]>([]);
|
|
454
|
+
|
|
455
|
+
// Имитация загрузки: прогресс по таймеру вместо XHR-запроса
|
|
456
|
+
const customRequest = ({ onProgress, onSuccess }: NUploader.IUploadRequestOption) => {
|
|
457
|
+
let percent = 0;
|
|
458
|
+
|
|
459
|
+
const timer = setInterval(() => {
|
|
460
|
+
percent += 20;
|
|
461
|
+
onProgress?.({ percent });
|
|
462
|
+
|
|
463
|
+
if (percent >= 100) {
|
|
464
|
+
clearInterval(timer);
|
|
465
|
+
onSuccess?.({});
|
|
466
|
+
}
|
|
467
|
+
}, 400);
|
|
468
|
+
|
|
469
|
+
return { abort: () => clearInterval(timer) };
|
|
470
|
+
};
|
|
471
|
+
</script>
|
|
472
|
+
|
|
473
|
+
<template>
|
|
474
|
+
<div class="w-[350px] m-auto">
|
|
475
|
+
<CdsUploader
|
|
476
|
+
v-model="files"
|
|
477
|
+
label="Загрузка без сервера"
|
|
478
|
+
description="Файл никуда не отправляется — прогресс имитируется"
|
|
479
|
+
:custom-request="customRequest"
|
|
480
|
+
:show-upload-list="{ showRemoveIcon: true }"
|
|
481
|
+
/>
|
|
482
|
+
</div>
|
|
483
|
+
</template>
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
## Events
|
|
487
|
+
|
|
488
|
+
The component reports every step: `change` — any change of the list, `progress`, `success` and `error` — the course of the upload, `remove`, `drop`, `reject`, `download`, `preview` — the actions of the user. Open the console to see them.
|
|
489
|
+
|
|
490
|
+
**Example (SFC):**
|
|
491
|
+
|
|
492
|
+
```vue
|
|
493
|
+
<script setup lang="ts">
|
|
494
|
+
import type { NUploader } from '@central-design-system/components';
|
|
495
|
+
import { CdsUploader } from '@central-design-system/components';
|
|
496
|
+
import { ref } from 'vue';
|
|
497
|
+
|
|
498
|
+
const files = ref<NUploader.IUploadFile[]>([]);
|
|
499
|
+
|
|
500
|
+
const handleChange = (info: NUploader.IUploadChangeParam<NUploader.IUploadFile> | Event) => {
|
|
501
|
+
console.log('onChange', info);
|
|
502
|
+
};
|
|
503
|
+
const handleProgress = (event: NUploader.IUploadChangeParam['event'], file: NUploader.IUploadFile) => {
|
|
504
|
+
console.log('onProgress', event, file);
|
|
505
|
+
};
|
|
506
|
+
const handleSuccess = (response: Record<string, any>, file: NUploader.IUploadFile) => {
|
|
507
|
+
console.log('onSuccess', response, file);
|
|
508
|
+
};
|
|
509
|
+
const handleError = (
|
|
510
|
+
event: NUploader.IUploadRequestError | ProgressEvent,
|
|
511
|
+
response: any,
|
|
512
|
+
file: NUploader.IUploadFile
|
|
513
|
+
) => {
|
|
514
|
+
console.log('onError', event, response, file);
|
|
515
|
+
};
|
|
516
|
+
const handleRemove = (file: NUploader.IUploadFile) => {
|
|
517
|
+
console.log('onRemove', file);
|
|
518
|
+
};
|
|
519
|
+
const handleDrop = (event: DragEvent) => {
|
|
520
|
+
console.log('onDrop', event);
|
|
521
|
+
};
|
|
522
|
+
const handleReject = (rejected: NUploader.IUploadFile[]) => {
|
|
523
|
+
console.log('onReject', rejected);
|
|
524
|
+
};
|
|
525
|
+
const handleDownload = (file: NUploader.IUploadFile) => {
|
|
526
|
+
console.log('onDownload', file);
|
|
527
|
+
};
|
|
528
|
+
const handlePreview = (file: NUploader.IUploadFile) => {
|
|
529
|
+
console.log('onPreview', file);
|
|
530
|
+
};
|
|
531
|
+
</script>
|
|
532
|
+
|
|
533
|
+
<template>
|
|
534
|
+
<div class="w-[350px] m-auto">
|
|
535
|
+
<CdsUploader
|
|
536
|
+
v-model="files"
|
|
537
|
+
label="Загрузка файлов"
|
|
538
|
+
description="Откройте консоль, чтобы увидеть все циклы событий"
|
|
539
|
+
action="https://user1694090019726.requestly.dev/upload"
|
|
540
|
+
:show-upload-list="{ showDownloadIcon: true, showRemoveIcon: true }"
|
|
541
|
+
@change="handleChange"
|
|
542
|
+
@progress="handleProgress"
|
|
543
|
+
@success="handleSuccess"
|
|
544
|
+
@error="handleError"
|
|
545
|
+
@remove="handleRemove"
|
|
546
|
+
@drop="handleDrop"
|
|
547
|
+
@reject="handleReject"
|
|
548
|
+
@download="handleDownload"
|
|
549
|
+
@preview="handlePreview"
|
|
550
|
+
/>
|
|
551
|
+
</div>
|
|
552
|
+
</template>
|
|
553
|
+
```
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# CdsUploader — guidelines
|
|
2
|
+
|
|
3
|
+
> Extracted from `docs/demos/Guidelines.vue` by `bun run generate:skill`. Do not edit manually.
|
|
4
|
+
> The full component contract is in [api.md](api.md).
|
|
5
|
+
|
|
6
|
+
| ✅ Do | ❌ Don't |
|
|
7
|
+
| --- | --- |
|
|
8
|
+
| The description names the allowed formats and size upfront — the user does not waste an attempt. | Without a description the restrictions are learned only from an error after the upload. |
|
|
9
|
+
| The text of the button names exactly what to upload. | “Click here” says nothing about the action nor about the content. |
|
|
10
|
+
| The list shows what has already been uploaded and lets the extra files be removed. | With the list hidden the user does not see the result and uploads the files again. |
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# CdsUploader — tokens (level 3)
|
|
2
|
+
|
|
3
|
+
> Copy of the component's `styles/*.variables.scss`, taken by `bun run generate:skill`. Do not edit manually.
|
|
4
|
+
> `--cds-*` are global level-2 tokens whose values come from the active theme: see [themes.md](../../tokens/themes.md).
|
|
5
|
+
> Variables marked `!default` can be overridden at build time via SCSS.
|
|
6
|
+
|
|
7
|
+
## _CdsUploader.variables.scss
|
|
8
|
+
|
|
9
|
+
```scss
|
|
10
|
+
@use 'sass:map';
|
|
11
|
+
@use '../../../styles/tools';
|
|
12
|
+
|
|
13
|
+
$uploader-color: (
|
|
14
|
+
'hover': rgb(var(--cds-color-fill-primary-hover)),
|
|
15
|
+
'progress': rgb(var(--cds-color-status-progress-surface)),
|
|
16
|
+
'text': rgb(var(--cds-color-content-primary))
|
|
17
|
+
) !default;
|
|
18
|
+
$uploader-label-offset: var(--cds-spacing-200) !default;
|
|
19
|
+
$uploader-description-offset: var(--cds-spacing-200) !default;
|
|
20
|
+
$uploader-messages-offset: var(--cds-spacing-200) !default;
|
|
21
|
+
$uploader-list-item-height: tools.to-rem(32px) !default;
|
|
22
|
+
$uploader-list-item-padding-inline: var(--cds-spacing-200) !default;
|
|
23
|
+
$uploader-list-item-padding-block: var(--cds-spacing-50) !default;
|
|
24
|
+
$uploader-list-item-gap: var(--cds-spacing-200) !default;
|
|
25
|
+
$uploader-item-progress-offset: $uploader-list-item-padding-block !default;
|
|
26
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# CdsVirtualScroll — API
|
|
2
|
+
|
|
3
|
+
> Generated from meta.json by `bun run generate:skill`. Do not edit manually.
|
|
4
|
+
> Examples: [examples.md](examples.md) · Guidelines: [guidelines.md](guidelines.md) · Tokens: [tokens.md](tokens.md)
|
|
5
|
+
|
|
6
|
+
Virtual scrolling keeps long lists fast: only the visible rows get into the DOM, not the whole array. Pass the records to `items`, the markup of a row to the slot, and a list of tens of thousands of positions scrolls as smoothly as a list of ten.
|
|
7
|
+
|
|
8
|
+
Family: [CdsVirtualScroll](#cdsvirtualscroll) + subcomponents: [CdsVirtualScrollItem](#cdsvirtualscrollitem).
|
|
9
|
+
|
|
10
|
+
## CdsVirtualScroll
|
|
11
|
+
|
|
12
|
+
**Props**
|
|
13
|
+
|
|
14
|
+
| Prop | Type | Default | Required | Description |
|
|
15
|
+
| --- | --- | --- | --- | --- |
|
|
16
|
+
| `height` | `string \| number \| undefined` | — | no | Component height |
|
|
17
|
+
| `itemHeight` | `string \| number \| undefined` | `null` | no | Height of a single item in pixels. When omitted, the height is measured automatically. |
|
|
18
|
+
| `itemKey` | `SelectItemKey` | `null` | no | Key that identifies an item (a field name, a path or a function). The index is used by default. |
|
|
19
|
+
| `items` | `readonly unknown[] \| undefined` | `[]` | no | Array of the items rendered by the virtual scroll. |
|
|
20
|
+
| `maxHeight` | `string \| number \| undefined` | — | no | Maximum component height |
|
|
21
|
+
| `maxWidth` | `string \| number \| undefined` | — | no | Maximum component width |
|
|
22
|
+
| `minHeight` | `string \| number \| undefined` | — | no | Minimum component height |
|
|
23
|
+
| `minWidth` | `string \| number \| undefined` | — | no | Minimum component width |
|
|
24
|
+
| `renderless` | `boolean \| undefined` | — | no | Renderless mode: the component does not create its own scroll container and uses the nearest scrollable parent instead. |
|
|
25
|
+
| `width` | `string \| number \| undefined` | — | no | Component width |
|
|
26
|
+
|
|
27
|
+
**Slots**
|
|
28
|
+
|
|
29
|
+
| Name | Type | Description |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| `default` | `CdsVirtualScrollSlot<any> & { itemRef?: TemplateRef \| undefined; }` | Content of a single list item. In `renderless` mode it additionally receives `itemRef`. |
|
|
32
|
+
|
|
33
|
+
**Exposed**
|
|
34
|
+
|
|
35
|
+
| Name | Type | Description |
|
|
36
|
+
| --- | --- | --- |
|
|
37
|
+
| `calculateVisibleItems` | `() => void` | Recalculates the window of visible items — needed after their height changes outside the update cycle. |
|
|
38
|
+
| `scrollToIndex` | `(index: number) => void` | Scrolls the list to the item with the given index. |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## CdsVirtualScrollItem
|
|
43
|
+
|
|
44
|
+
**Props**
|
|
45
|
+
|
|
46
|
+
| Prop | Type | Default | Required | Description |
|
|
47
|
+
| --- | --- | --- | --- | --- |
|
|
48
|
+
| `renderless` | `boolean \| undefined` | — | no | Renderless mode: the item renders only the slot content, without a wrapper. |
|
|
49
|
+
|
|
50
|
+
**Events**
|
|
51
|
+
|
|
52
|
+
| Name | Type | Description |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| `update:height` | `[height: number]` | Tells the virtual list that the height of the item has changed. |
|
|
55
|
+
|
|
56
|
+
**Slots**
|
|
57
|
+
|
|
58
|
+
| Name | Type | Description |
|
|
59
|
+
| --- | --- | --- |
|
|
60
|
+
| `default` | `{ itemRef: TemplateRef; }` | Content of the item. In `renderless` mode it receives `itemRef` to measure the height. |
|