@julianoczkowski/create-trimble-app 2.0.0
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/README.md +191 -0
- package/bin/create-trimble-app.js +9 -0
- package/package.json +67 -0
- package/src/cli.js +134 -0
- package/src/frameworks.js +28 -0
- package/src/scaffold.js +209 -0
- package/src/utils/file.js +47 -0
- package/src/utils/git.js +140 -0
- package/src/utils/install.js +25 -0
- package/src/utils/logger.js +124 -0
- package/templates/angular/.cursor/commands/remove-dev-content.md +394 -0
- package/templates/angular/.cursor/mcp.json +13 -0
- package/templates/angular/.cursor/rules/modus-angular-20.mdc +82 -0
- package/templates/angular/.cursor/rules/modus-angular-accordion-state-management-short.mdc +45 -0
- package/templates/angular/.cursor/rules/modus-angular-accordion-state-management.mdc +322 -0
- package/templates/angular/.cursor/rules/modus-angular-best-practices.mdc +472 -0
- package/templates/angular/.cursor/rules/modus-angular-border-usage-short.mdc +48 -0
- package/templates/angular/.cursor/rules/modus-angular-border-usage.mdc +286 -0
- package/templates/angular/.cursor/rules/modus-angular-button-group-usage-short.mdc +47 -0
- package/templates/angular/.cursor/rules/modus-angular-button-group-usage.mdc +263 -0
- package/templates/angular/.cursor/rules/modus-angular-checkbox-value-inversion-short.mdc +36 -0
- package/templates/angular/.cursor/rules/modus-angular-checkbox-value-inversion.mdc +92 -0
- package/templates/angular/.cursor/rules/modus-angular-chrome-devtools-testing-short.mdc +34 -0
- package/templates/angular/.cursor/rules/modus-angular-chrome-devtools-testing.mdc +185 -0
- package/templates/angular/.cursor/rules/modus-angular-color-usage-short.mdc +56 -0
- package/templates/angular/.cursor/rules/modus-angular-color-usage.mdc +208 -0
- package/templates/angular/.cursor/rules/modus-angular-components-reference.mdc +114 -0
- package/templates/angular/.cursor/rules/modus-angular-design-system.mdc +273 -0
- package/templates/angular/.cursor/rules/modus-angular-development-workflow-short.mdc +43 -0
- package/templates/angular/.cursor/rules/modus-angular-development-workflow.mdc +145 -0
- package/templates/angular/.cursor/rules/modus-angular-essentials.mdc +272 -0
- package/templates/angular/.cursor/rules/modus-angular-forms-validation-short.mdc +56 -0
- package/templates/angular/.cursor/rules/modus-angular-forms-validation.mdc +124 -0
- package/templates/angular/.cursor/rules/modus-angular-icon-names.mdc +70 -0
- package/templates/angular/.cursor/rules/modus-angular-icons-short.mdc +40 -0
- package/templates/angular/.cursor/rules/modus-angular-icons.mdc +137 -0
- package/templates/angular/.cursor/rules/modus-angular-implementation-guides-short.mdc +36 -0
- package/templates/angular/.cursor/rules/modus-angular-implementation-guides.mdc +301 -0
- package/templates/angular/.cursor/rules/modus-angular-integration-short.mdc +60 -0
- package/templates/angular/.cursor/rules/modus-angular-integration.mdc +1096 -0
- package/templates/angular/.cursor/rules/modus-angular-master.mdc +164 -0
- package/templates/angular/.cursor/rules/modus-angular-modal-usage-short.mdc +51 -0
- package/templates/angular/.cursor/rules/modus-angular-modal-usage.mdc +115 -0
- package/templates/angular/.cursor/rules/modus-angular-navbar-usage-short.mdc +49 -0
- package/templates/angular/.cursor/rules/modus-angular-navbar-usage.mdc +146 -0
- package/templates/angular/.cursor/rules/modus-angular-no-emojis.mdc +66 -0
- package/templates/angular/.cursor/rules/modus-angular-opacity-utilities-short.mdc +43 -0
- package/templates/angular/.cursor/rules/modus-angular-opacity-utilities.mdc +160 -0
- package/templates/angular/.cursor/rules/modus-angular-select-vs-dropdown-menu-short.mdc +51 -0
- package/templates/angular/.cursor/rules/modus-angular-select-vs-dropdown-menu.mdc +83 -0
- package/templates/angular/.cursor/rules/modus-angular-semantic-html-short.mdc +36 -0
- package/templates/angular/.cursor/rules/modus-angular-semantic-html.mdc +81 -0
- package/templates/angular/.cursor/rules/modus-angular-side-navigation-usage-short.mdc +50 -0
- package/templates/angular/.cursor/rules/modus-angular-side-navigation-usage.mdc +136 -0
- package/templates/angular/.cursor/rules/modus-angular-table-usage-short.mdc +52 -0
- package/templates/angular/.cursor/rules/modus-angular-table-usage.mdc +151 -0
- package/templates/angular/.cursor/rules/modus-angular-tailwind-usage-short.mdc +44 -0
- package/templates/angular/.cursor/rules/modus-angular-tailwind-usage.mdc +242 -0
- package/templates/angular/.cursor/rules/modus-angular-themes-short.mdc +54 -0
- package/templates/angular/.cursor/rules/modus-angular-themes.mdc +222 -0
- package/templates/angular/.cursor/rules/modus-angular-utility-panel-usage-short.mdc +52 -0
- package/templates/angular/.cursor/rules/modus-angular-utility-panel-usage.mdc +130 -0
- package/templates/angular/.cursor/rules/ux/gestalt-laws-detailed.mdc +514 -0
- package/templates/angular/.cursor/rules/ux/ux-ui-foundations.mdc +235 -0
- package/templates/angular/.cursor/skills/run-lint-checks/SKILL.md +169 -0
- package/templates/angular/.editorconfig +17 -0
- package/templates/angular/.github/dependabot.yml +19 -0
- package/templates/angular/.github/workflows/a11y-check.yml +135 -0
- package/templates/angular/.github/workflows/ci.yml +44 -0
- package/templates/angular/.husky/pre-commit +32 -0
- package/templates/angular/.postcssrc.json +5 -0
- package/templates/angular/.vscode/extensions.json +4 -0
- package/templates/angular/.vscode/launch.json +20 -0
- package/templates/angular/.vscode/tasks.json +42 -0
- package/templates/angular/CLAUDE.md +148 -0
- package/templates/angular/README.md +92 -0
- package/templates/angular/amplify.yml +25 -0
- package/templates/angular/angular.json +106 -0
- package/templates/angular/data/modusIcons.ts +861 -0
- package/templates/angular/package-lock.json +11030 -0
- package/templates/angular/package.json +66 -0
- package/templates/angular/public/angular-icon.svg +12 -0
- package/templates/angular/public/favicon.ico +0 -0
- package/templates/angular/public/modus-icons.css +49 -0
- package/templates/angular/public/vite.svg +1 -0
- package/templates/angular/scripts/README.md +410 -0
- package/templates/angular/scripts/check-border-violations.js +352 -0
- package/templates/angular/scripts/check-icon-names.js +402 -0
- package/templates/angular/scripts/check-inline-styles.js +292 -0
- package/templates/angular/scripts/check-modus-colors.js +282 -0
- package/templates/angular/scripts/check-modus-icons.js +263 -0
- package/templates/angular/scripts/check-opacity-utilities.js +426 -0
- package/templates/angular/scripts/check-semantic-html.js +452 -0
- package/templates/angular/scripts/check-typescript.js +109 -0
- package/templates/angular/src/app/app.config.ts +29 -0
- package/templates/angular/src/app/app.css +0 -0
- package/templates/angular/src/app/app.html +4 -0
- package/templates/angular/src/app/app.routes.ts +351 -0
- package/templates/angular/src/app/app.spec.ts +27 -0
- package/templates/angular/src/app/app.ts +47 -0
- package/templates/angular/src/app/components/README.md +77 -0
- package/templates/angular/src/app/components/index.ts +53 -0
- package/templates/angular/src/app/components/modus-accordion.component.ts +50 -0
- package/templates/angular/src/app/components/modus-alert.component.ts +133 -0
- package/templates/angular/src/app/components/modus-autocomplete.component.ts +262 -0
- package/templates/angular/src/app/components/modus-avatar.component.ts +75 -0
- package/templates/angular/src/app/components/modus-badge.component.ts +84 -0
- package/templates/angular/src/app/components/modus-breadcrumbs.component.ts +65 -0
- package/templates/angular/src/app/components/modus-button-group.component.ts +82 -0
- package/templates/angular/src/app/components/modus-button.component.ts +292 -0
- package/templates/angular/src/app/components/modus-card.component.ts +73 -0
- package/templates/angular/src/app/components/modus-checkbox.component.ts +117 -0
- package/templates/angular/src/app/components/modus-chip.component.ts +97 -0
- package/templates/angular/src/app/components/modus-collapse.component.ts +118 -0
- package/templates/angular/src/app/components/modus-date.component.ts +165 -0
- package/templates/angular/src/app/components/modus-dropdown-menu.component.ts +108 -0
- package/templates/angular/src/app/components/modus-file-dropzone.component.ts +121 -0
- package/templates/angular/src/app/components/modus-handle.component.ts +96 -0
- package/templates/angular/src/app/components/modus-icon.component.ts +81 -0
- package/templates/angular/src/app/components/modus-input-feedback.component.ts +54 -0
- package/templates/angular/src/app/components/modus-input-label.component.ts +62 -0
- package/templates/angular/src/app/components/modus-loader.component.ts +48 -0
- package/templates/angular/src/app/components/modus-logo.component.ts +115 -0
- package/templates/angular/src/app/components/modus-menu-item.component.ts +116 -0
- package/templates/angular/src/app/components/modus-menu.component.ts +58 -0
- package/templates/angular/src/app/components/modus-modal.component.ts +70 -0
- package/templates/angular/src/app/components/modus-navbar.component.ts +303 -0
- package/templates/angular/src/app/components/modus-number-input.component.ts +174 -0
- package/templates/angular/src/app/components/modus-pagination.component.ts +74 -0
- package/templates/angular/src/app/components/modus-panel.component.ts +61 -0
- package/templates/angular/src/app/components/modus-progress.component.ts +62 -0
- package/templates/angular/src/app/components/modus-radio.component.ts +102 -0
- package/templates/angular/src/app/components/modus-rating.component.ts +80 -0
- package/templates/angular/src/app/components/modus-select.component.ts +131 -0
- package/templates/angular/src/app/components/modus-side-navigation.component.ts +90 -0
- package/templates/angular/src/app/components/modus-skeleton.component.ts +54 -0
- package/templates/angular/src/app/components/modus-slider.component.ts +132 -0
- package/templates/angular/src/app/components/modus-stepper.component.ts +65 -0
- package/templates/angular/src/app/components/modus-switch.component.ts +118 -0
- package/templates/angular/src/app/components/modus-table.component.ts +204 -0
- package/templates/angular/src/app/components/modus-tabs.component.ts +82 -0
- package/templates/angular/src/app/components/modus-text-input.component.ts +221 -0
- package/templates/angular/src/app/components/modus-textarea.component.ts +168 -0
- package/templates/angular/src/app/components/modus-theme-switcher.component.ts +45 -0
- package/templates/angular/src/app/components/modus-time-input.component.ts +172 -0
- package/templates/angular/src/app/components/modus-toast.component.ts +63 -0
- package/templates/angular/src/app/components/modus-toolbar.component.ts +43 -0
- package/templates/angular/src/app/components/modus-tooltip.component.ts +83 -0
- package/templates/angular/src/app/components/modus-typography.component.ts +79 -0
- package/templates/angular/src/app/components/modus-utility-panel.component.ts +275 -0
- package/templates/angular/src/app/components/theme-demo.component.ts +1242 -0
- package/templates/angular/src/app/data/component-demos.ts +360 -0
- package/templates/angular/src/app/data/modus-icons.ts +806 -0
- package/templates/angular/src/app/demos/accordion/accordion-demo.component.ts +212 -0
- package/templates/angular/src/app/demos/alert/alert-demo.component.ts +108 -0
- package/templates/angular/src/app/demos/autocomplete/autocomplete-demo.component.ts +174 -0
- package/templates/angular/src/app/demos/avatar/avatar-demo.component.ts +149 -0
- package/templates/angular/src/app/demos/badge/badge-demo.component.ts +148 -0
- package/templates/angular/src/app/demos/breadcrumbs/breadcrumbs-demo.component.ts +96 -0
- package/templates/angular/src/app/demos/button/button-demo.component.ts +256 -0
- package/templates/angular/src/app/demos/button-group/button-group-demo.component.ts +215 -0
- package/templates/angular/src/app/demos/card/card-demo.component.ts +180 -0
- package/templates/angular/src/app/demos/checkbox/checkbox-demo.component.ts +71 -0
- package/templates/angular/src/app/demos/chip/chip-demo.component.ts +183 -0
- package/templates/angular/src/app/demos/date/date-demo.component.ts +193 -0
- package/templates/angular/src/app/demos/dropdown/dropdown-demo.component.ts +196 -0
- package/templates/angular/src/app/demos/file-dropzone/file-dropzone-demo.component.ts +176 -0
- package/templates/angular/src/app/demos/handle/handle-demo.component.ts +265 -0
- package/templates/angular/src/app/demos/icon/icon-demo.component.ts +65 -0
- package/templates/angular/src/app/demos/input-feedback/input-feedback-demo.component.ts +189 -0
- package/templates/angular/src/app/demos/input-label/input-label-demo.component.ts +330 -0
- package/templates/angular/src/app/demos/loader/loader-demo.component.ts +143 -0
- package/templates/angular/src/app/demos/logo/logo-demo.component.ts +191 -0
- package/templates/angular/src/app/demos/menu/menu-demo.component.ts +72 -0
- package/templates/angular/src/app/demos/modal/modal-demo.component.ts +278 -0
- package/templates/angular/src/app/demos/navbar/navbar-demo.component.ts +135 -0
- package/templates/angular/src/app/demos/number-input/number-input-demo.component.ts +175 -0
- package/templates/angular/src/app/demos/pagination/pagination-demo.component.ts +134 -0
- package/templates/angular/src/app/demos/panel/panel-demo.component.ts +235 -0
- package/templates/angular/src/app/demos/progress/progress-demo.component.ts +169 -0
- package/templates/angular/src/app/demos/radio/radio-demo.component.ts +161 -0
- package/templates/angular/src/app/demos/rating/rating-demo.component.ts +97 -0
- package/templates/angular/src/app/demos/select/select-demo.component.ts +107 -0
- package/templates/angular/src/app/demos/shared/demo-example-clean.component.ts +41 -0
- package/templates/angular/src/app/demos/shared/demo-example.component.ts +42 -0
- package/templates/angular/src/app/demos/shared/demo-page.component.ts +97 -0
- package/templates/angular/src/app/demos/shared/index.ts +3 -0
- package/templates/angular/src/app/demos/side-navigation/side-navigation-demo.component.ts +524 -0
- package/templates/angular/src/app/demos/skeleton/skeleton-demo.component.ts +112 -0
- package/templates/angular/src/app/demos/slider/slider-demo.component.ts +76 -0
- package/templates/angular/src/app/demos/stepper/stepper-demo.component.ts +79 -0
- package/templates/angular/src/app/demos/switch/switch-demo.component.ts +113 -0
- package/templates/angular/src/app/demos/table/table-demo.component.ts +405 -0
- package/templates/angular/src/app/demos/tabs/tabs-demo.component.ts +318 -0
- package/templates/angular/src/app/demos/text-input/text-input-demo.component.ts +160 -0
- package/templates/angular/src/app/demos/textarea/textarea-demo.component.ts +95 -0
- package/templates/angular/src/app/demos/theme-switcher/theme-switcher-demo.component.ts +38 -0
- package/templates/angular/src/app/demos/time-input/time-input-demo.component.ts +130 -0
- package/templates/angular/src/app/demos/toast/toast-demo.component.ts +258 -0
- package/templates/angular/src/app/demos/toolbar/toolbar-demo.component.ts +54 -0
- package/templates/angular/src/app/demos/tooltip/tooltip-demo.component.ts +163 -0
- package/templates/angular/src/app/demos/utility-panel/utility-panel-demo.component.ts +197 -0
- package/templates/angular/src/app/dev/dev-config.ts +119 -0
- package/templates/angular/src/app/dev/dev-panel/dev-panel.component.ts +215 -0
- package/templates/angular/src/app/dev/dev-panel.service.ts +63 -0
- package/templates/angular/src/app/dev/index.ts +8 -0
- package/templates/angular/src/app/dev/theme-switcher-dropdown/theme-switcher-dropdown.component.ts +134 -0
- package/templates/angular/src/app/dev-pages/color-palette/color-palette.component.ts +229 -0
- package/templates/angular/src/app/dev-pages/components-gallery/components-gallery.component.ts +486 -0
- package/templates/angular/src/app/dev-pages/icons/icons.component.ts +149 -0
- package/templates/angular/src/app/pages/home/home.component.ts +251 -0
- package/templates/angular/src/app/services/README.md +57 -0
- package/templates/angular/src/app/services/theme.service.ts +163 -0
- package/templates/angular/src/environments/environment.development.ts +8 -0
- package/templates/angular/src/environments/environment.ts +8 -0
- package/templates/angular/src/index.html +14 -0
- package/templates/angular/src/main.ts +6 -0
- package/templates/angular/src/styles.css +1328 -0
- package/templates/angular/tsconfig.app.json +15 -0
- package/templates/angular/tsconfig.json +35 -0
- package/templates/angular/tsconfig.spec.json +14 -0
- package/templates/config.json +23 -0
- package/templates/react/.cursor/commands/remove-dev-content.md +311 -0
- package/templates/react/.cursor/mcp.json +13 -0
- package/templates/react/.cursor/rules/README.md +240 -0
- package/templates/react/.cursor/rules/border-usage-guidelines-short.mdc +22 -0
- package/templates/react/.cursor/rules/border-usage-guidelines.mdc +380 -0
- package/templates/react/.cursor/rules/chrome-devtools-testing-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/development-workflow-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/development-workflow-react.mdc +292 -0
- package/templates/react/.cursor/rules/implementation-guides-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/implementation-guides-react.mdc +446 -0
- package/templates/react/.cursor/rules/modus-accordion-state-management-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-accordion-state-management-react.mdc +445 -0
- package/templates/react/.cursor/rules/modus-button-group-usage-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-button-group-usage-react.mdc +117 -0
- package/templates/react/.cursor/rules/modus-checkbox-value-inversion-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-checkbox-value-inversion-react.mdc +492 -0
- package/templates/react/.cursor/rules/modus-color-usage-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-color-usage-react.mdc +420 -0
- package/templates/react/.cursor/rules/modus-components-reference.mdc +366 -0
- package/templates/react/.cursor/rules/modus-icon-names.mdc +63 -0
- package/templates/react/.cursor/rules/modus-icons-react-short.mdc +24 -0
- package/templates/react/.cursor/rules/modus-icons-react.mdc +402 -0
- package/templates/react/.cursor/rules/modus-modal-implementation-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-modal-implementation-react.mdc +831 -0
- package/templates/react/.cursor/rules/modus-navbar-side-navigation-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-navbar-side-navigation-react.mdc +247 -0
- package/templates/react/.cursor/rules/modus-no-emojis-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-opacity-utilities-react-short.mdc +70 -0
- package/templates/react/.cursor/rules/modus-opacity-utilities-react.mdc +208 -0
- package/templates/react/.cursor/rules/modus-react-best-practices-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-react-best-practices.mdc +508 -0
- package/templates/react/.cursor/rules/modus-react-essentials.mdc +209 -0
- package/templates/react/.cursor/rules/modus-react-integration-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-react-integration.mdc +509 -0
- package/templates/react/.cursor/rules/modus-react-key-warnings-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-react-key-warnings.mdc +805 -0
- package/templates/react/.cursor/rules/modus-react-master.mdc +160 -0
- package/templates/react/.cursor/rules/modus-select-vs-dropdown-menu-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-select-vs-dropdown-menu-react.mdc +442 -0
- package/templates/react/.cursor/rules/modus-semantic-html-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-semantic-html-react.mdc +427 -0
- package/templates/react/.cursor/rules/modus-tailwind-usage-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-tailwind-usage-react.mdc +642 -0
- package/templates/react/.cursor/rules/modus-themes-react-short.mdc +23 -0
- package/templates/react/.cursor/rules/modus-themes-react.mdc +506 -0
- package/templates/react/.cursor/rules/ux/gestalt-laws-detailed.mdc +456 -0
- package/templates/react/.cursor/rules/ux/ux-ui-foundations.mdc +211 -0
- package/templates/react/.cursor/skills/create-modus-form-component/SKILL.md +518 -0
- package/templates/react/.cursor/skills/create-modus-wrapper-component/SKILL.md +252 -0
- package/templates/react/.cursor/skills/fix-modus-component-event-issues/SKILL.md +345 -0
- package/templates/react/.cursor/skills/handle-modus-checkbox-value-bug/SKILL.md +202 -0
- package/templates/react/.cursor/skills/implement-modus-modal-with-refs/SKILL.md +386 -0
- package/templates/react/.cursor/skills/integrate-modus-icons/SKILL.md +300 -0
- package/templates/react/.cursor/skills/run-lint-checks/SKILL.md +235 -0
- package/templates/react/.cursor/skills/set-up-modus-event-listeners/SKILL.md +284 -0
- package/templates/react/.cursor/skills/style-modus-components-with-tailwind/SKILL.md +382 -0
- package/templates/react/.env.development +3 -0
- package/templates/react/.env.production +3 -0
- package/templates/react/.github/CODEOWNERS +28 -0
- package/templates/react/.github/ISSUE_TEMPLATE/bug_report.yml +176 -0
- package/templates/react/.github/ISSUE_TEMPLATE/config.yml +20 -0
- package/templates/react/.github/ISSUE_TEMPLATE/documentation.yml +115 -0
- package/templates/react/.github/ISSUE_TEMPLATE/feature_request.yml +171 -0
- package/templates/react/.github/ISSUE_TEMPLATE/question.yml +139 -0
- package/templates/react/.github/copilot-instructions.md +80 -0
- package/templates/react/.github/instructions/components.instructions.md +82 -0
- package/templates/react/.github/instructions/demos.instructions.md +82 -0
- package/templates/react/.github/instructions/pages.instructions.md +76 -0
- package/templates/react/.github/instructions/styles.instructions.md +77 -0
- package/templates/react/.github/instructions/typescript.instructions.md +101 -0
- package/templates/react/.github/pull_request_template.md +188 -0
- package/templates/react/.github/workflows/ci.yml +43 -0
- package/templates/react/.github/workflows/claude-code-review.yml +44 -0
- package/templates/react/.github/workflows/claude.yml +50 -0
- package/templates/react/.husky/pre-commit +28 -0
- package/templates/react/.vscode/extensions.json +8 -0
- package/templates/react/CLAUDE.md +119 -0
- package/templates/react/CODE_OF_CONDUCT.md +79 -0
- package/templates/react/CONTRIBUTING.md +65 -0
- package/templates/react/LICENSE +21 -0
- package/templates/react/README.md +728 -0
- package/templates/react/SECURITY.md +50 -0
- package/templates/react/eslint.config.js +23 -0
- package/templates/react/index.html +13 -0
- package/templates/react/package-lock.json +5209 -0
- package/templates/react/package.json +49 -0
- package/templates/react/postcss.config.js +6 -0
- package/templates/react/public/react.svg +1 -0
- package/templates/react/public/vite.svg +1 -0
- package/templates/react/readme_assets/getting_started_header.png +0 -0
- package/templates/react/readme_assets/hero.png +0 -0
- package/templates/react/readme_assets/modus_comp.png +0 -0
- package/templates/react/readme_assets/modus_figma_mcp.png +0 -0
- package/templates/react/readme_assets/teaser_comp.gif +0 -0
- package/templates/react/scripts/README.md +343 -0
- package/templates/react/scripts/check-border-violations.js +483 -0
- package/templates/react/scripts/check-icon-names.js +486 -0
- package/templates/react/scripts/check-inline-styles.js +364 -0
- package/templates/react/scripts/check-modus-colors.js +247 -0
- package/templates/react/scripts/check-modus-icons.js +256 -0
- package/templates/react/scripts/check-opacity-utilities.js +481 -0
- package/templates/react/scripts/check-semantic-html.js +476 -0
- package/templates/react/scripts/check-typescript.js +109 -0
- package/templates/react/src/App.css +42 -0
- package/templates/react/src/App.tsx +54 -0
- package/templates/react/src/assets/react.svg +1 -0
- package/templates/react/src/components/DemoExample.tsx +61 -0
- package/templates/react/src/components/DemoPage.tsx +81 -0
- package/templates/react/src/components/ModusAccordion.tsx +89 -0
- package/templates/react/src/components/ModusAlert.tsx +85 -0
- package/templates/react/src/components/ModusAutocomplete.tsx +207 -0
- package/templates/react/src/components/ModusAvatar.tsx +50 -0
- package/templates/react/src/components/ModusBadge.tsx +82 -0
- package/templates/react/src/components/ModusBreadcrumbs.tsx +75 -0
- package/templates/react/src/components/ModusButton.tsx +244 -0
- package/templates/react/src/components/ModusButtonGroup.tsx +91 -0
- package/templates/react/src/components/ModusCard.tsx +70 -0
- package/templates/react/src/components/ModusCheckbox.tsx +168 -0
- package/templates/react/src/components/ModusChip.tsx +93 -0
- package/templates/react/src/components/ModusDate.tsx +154 -0
- package/templates/react/src/components/ModusDropdownMenu.tsx +148 -0
- package/templates/react/src/components/ModusFileDropzone.tsx +140 -0
- package/templates/react/src/components/ModusHandle.tsx +101 -0
- package/templates/react/src/components/ModusIcon.tsx +49 -0
- package/templates/react/src/components/ModusInputFeedback.tsx +52 -0
- package/templates/react/src/components/ModusInputLabel.tsx +50 -0
- package/templates/react/src/components/ModusLoader.tsx +42 -0
- package/templates/react/src/components/ModusLogo.tsx +102 -0
- package/templates/react/src/components/ModusMenu.tsx +119 -0
- package/templates/react/src/components/ModusMenuItem.tsx +86 -0
- package/templates/react/src/components/ModusModal.tsx +145 -0
- package/templates/react/src/components/ModusNavbar.tsx +504 -0
- package/templates/react/src/components/ModusNumberInput.tsx +230 -0
- package/templates/react/src/components/ModusPagination.tsx +94 -0
- package/templates/react/src/components/ModusPanel.tsx +92 -0
- package/templates/react/src/components/ModusProgress.tsx +70 -0
- package/templates/react/src/components/ModusProvider.tsx +18 -0
- package/templates/react/src/components/ModusRadio.tsx +114 -0
- package/templates/react/src/components/ModusRating.tsx +108 -0
- package/templates/react/src/components/ModusSelect.tsx +171 -0
- package/templates/react/src/components/ModusSideNavigation.tsx +149 -0
- package/templates/react/src/components/ModusSkeleton.tsx +42 -0
- package/templates/react/src/components/ModusSlider.tsx +128 -0
- package/templates/react/src/components/ModusStepper.tsx +85 -0
- package/templates/react/src/components/ModusSwitch.tsx +130 -0
- package/templates/react/src/components/ModusTable.tsx +309 -0
- package/templates/react/src/components/ModusTabs.tsx +114 -0
- package/templates/react/src/components/ModusTextInput.tsx +179 -0
- package/templates/react/src/components/ModusTextarea.tsx +164 -0
- package/templates/react/src/components/ModusThemeSwitcher.tsx +58 -0
- package/templates/react/src/components/ModusTimeInput.tsx +176 -0
- package/templates/react/src/components/ModusToast.tsx +207 -0
- package/templates/react/src/components/ModusToolbar.tsx +70 -0
- package/templates/react/src/components/ModusTooltip.tsx +97 -0
- package/templates/react/src/components/ModusUtilityPanel.tsx +198 -0
- package/templates/react/src/components/ThemeSwitcherDropdown.tsx +117 -0
- package/templates/react/src/components/ThemeToggleSimple.tsx +157 -0
- package/templates/react/src/config/routes.ts +196 -0
- package/templates/react/src/contexts/ThemeContext.tsx +81 -0
- package/templates/react/src/contexts/ThemeContextData.tsx +89 -0
- package/templates/react/src/data/modusIcons.ts +865 -0
- package/templates/react/src/demos/accordion-demo/page.tsx +236 -0
- package/templates/react/src/demos/alert-demo/page.tsx +94 -0
- package/templates/react/src/demos/autocomplete-demo/page.tsx +166 -0
- package/templates/react/src/demos/avatar-demo/page.tsx +135 -0
- package/templates/react/src/demos/badge-demo/page.tsx +174 -0
- package/templates/react/src/demos/breadcrumbs-demo/page.tsx +88 -0
- package/templates/react/src/demos/button-demo/page.tsx +261 -0
- package/templates/react/src/demos/button-group-demo/page.tsx +231 -0
- package/templates/react/src/demos/card-demo/page.tsx +241 -0
- package/templates/react/src/demos/checkbox-demo/page.tsx +79 -0
- package/templates/react/src/demos/chip-demo/page.tsx +197 -0
- package/templates/react/src/demos/date-demo/page.tsx +179 -0
- package/templates/react/src/demos/dropdown-demo/page.tsx +150 -0
- package/templates/react/src/demos/file-dropzone-demo/page.tsx +186 -0
- package/templates/react/src/demos/handle-demo/page.tsx +313 -0
- package/templates/react/src/demos/icon-demo/page.tsx +72 -0
- package/templates/react/src/demos/input-feedback-demo/page.tsx +202 -0
- package/templates/react/src/demos/input-label-demo/page.tsx +392 -0
- package/templates/react/src/demos/loader-demo/page.tsx +138 -0
- package/templates/react/src/demos/logo-demo/page.tsx +292 -0
- package/templates/react/src/demos/menu-demo/page.tsx +70 -0
- package/templates/react/src/demos/modal-demo/page.tsx +332 -0
- package/templates/react/src/demos/navbar-demo/page.tsx +141 -0
- package/templates/react/src/demos/number-input-demo/page.tsx +180 -0
- package/templates/react/src/demos/pagination-demo/page.tsx +147 -0
- package/templates/react/src/demos/panel-demo/page.tsx +376 -0
- package/templates/react/src/demos/progress-demo/page.tsx +185 -0
- package/templates/react/src/demos/radio-demo/page.tsx +242 -0
- package/templates/react/src/demos/rating-demo/page.tsx +97 -0
- package/templates/react/src/demos/select-demo/page.tsx +111 -0
- package/templates/react/src/demos/side-navigation-demo/page.tsx +775 -0
- package/templates/react/src/demos/skeleton-demo/page.tsx +107 -0
- package/templates/react/src/demos/slider-demo/page.tsx +78 -0
- package/templates/react/src/demos/stepper-demo/page.tsx +86 -0
- package/templates/react/src/demos/switch-demo/page.tsx +146 -0
- package/templates/react/src/demos/table-demo/page.tsx +489 -0
- package/templates/react/src/demos/tabs-demo/page.tsx +187 -0
- package/templates/react/src/demos/text-input-demo/page.tsx +151 -0
- package/templates/react/src/demos/textarea-demo/page.tsx +73 -0
- package/templates/react/src/demos/theme-switcher-demo/page.tsx +26 -0
- package/templates/react/src/demos/time-input-demo/page.tsx +148 -0
- package/templates/react/src/demos/toast-demo/page.tsx +302 -0
- package/templates/react/src/demos/toolbar-demo/page.tsx +49 -0
- package/templates/react/src/demos/tooltip-demo/page.tsx +209 -0
- package/templates/react/src/demos/typography-test/page.tsx +28 -0
- package/templates/react/src/demos/utility-panel-demo/page.tsx +197 -0
- package/templates/react/src/dev/DevPanel.tsx +219 -0
- package/templates/react/src/dev/DevPanelContext.ts +14 -0
- package/templates/react/src/dev/DevPanelProvider.tsx +63 -0
- package/templates/react/src/dev/DevRoutes.tsx +98 -0
- package/templates/react/src/dev/config.ts +127 -0
- package/templates/react/src/dev/index.ts +8 -0
- package/templates/react/src/dev/useDevPanel.ts +17 -0
- package/templates/react/src/dev-pages/ColorPalettePage.tsx +347 -0
- package/templates/react/src/dev-pages/ComponentsGalleryPage.tsx +489 -0
- package/templates/react/src/dev-pages/IconsPage.tsx +137 -0
- package/templates/react/src/dev-pages/index.ts +3 -0
- package/templates/react/src/hooks/useTheme.ts +15 -0
- package/templates/react/src/index.css +635 -0
- package/templates/react/src/main.tsx +14 -0
- package/templates/react/src/pages/HomePage.tsx +283 -0
- package/templates/react/src/vite-env.d.ts +9 -0
- package/templates/react/tailwind.config.js +58 -0
- package/templates/react/tsconfig.app.json +27 -0
- package/templates/react/tsconfig.json +7 -0
- package/templates/react/tsconfig.node.json +25 -0
- package/templates/react/vite.config.ts +18 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Comprehensive essential rules for Angular + Vite development with Modus Design System
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Angular Essentials
|
|
8
|
+
|
|
9
|
+
Comprehensive essential rules for Angular + Vite development with Modus Design System.
|
|
10
|
+
|
|
11
|
+
## Design System Integration
|
|
12
|
+
|
|
13
|
+
### Color Usage
|
|
14
|
+
|
|
15
|
+
- **Use design system colors only** - `bg-background`, `text-foreground`, `bg-primary`, etc.
|
|
16
|
+
- **Never use generic Tailwind colors** - No `bg-blue-500`, `text-gray-600`, etc.
|
|
17
|
+
- **Never use hardcoded values** - No hex colors, RGB values, or CSS variables directly
|
|
18
|
+
- **Use semantic color names** - `bg-destructive`, `text-warning`, `bg-success`
|
|
19
|
+
- **Follow color hierarchy** - Background > Card > Primary > Secondary > Muted
|
|
20
|
+
- **Test in all themes** - Ensure colors work in light and dark modes
|
|
21
|
+
|
|
22
|
+
### Opacity Usage
|
|
23
|
+
|
|
24
|
+
- **Use custom opacity utilities, not Tailwind /80 syntax** - `text-foreground-80` not `text-foreground/80`
|
|
25
|
+
- **CSS variables don't work with Tailwind opacity modifiers** - Tailwind needs actual color values
|
|
26
|
+
- **Available opacity levels** - `80`, `60`, `40`, `20` (e.g., `text-foreground-80`, `bg-primary-60`)
|
|
27
|
+
- **Available utilities** - `text-*`, `bg-*`, `border-*` with opacity variants
|
|
28
|
+
- **All utilities defined in styles.css** - No Tailwind config changes needed
|
|
29
|
+
- **Respects theme switching** - Works in all 6 Modus themes
|
|
30
|
+
|
|
31
|
+
### Border Usage
|
|
32
|
+
|
|
33
|
+
- **Use design system border utilities only** - `border-default`, `border-success`, `border-warning`, `border-destructive`, `border-primary`
|
|
34
|
+
- **Never use Tailwind color classes in borders** - No `border-blue-500`, `border-gray-300`, etc.
|
|
35
|
+
- **Use `border-thick` for emphasis** - For important borders and separators
|
|
36
|
+
- **Use directional borders** - `border-t`, `border-b`, `border-l`, `border-r` with design system colors
|
|
37
|
+
- **No inline styles for borders** - Use Tailwind classes exclusively
|
|
38
|
+
|
|
39
|
+
### Icons
|
|
40
|
+
|
|
41
|
+
- **Use Modus icons exclusively** - `<i class="modus-icons">icon-name</i>` or `<modus-icon name="icon-name" />`
|
|
42
|
+
- **Never use other icon libraries** - No Font Awesome, Material Icons, Heroicons, etc.
|
|
43
|
+
- **Use valid icon names only** - Check Modus Icons documentation for valid names
|
|
44
|
+
- **Size with Tailwind classes** - `text-sm`, `text-lg`, `text-xl` for sizing
|
|
45
|
+
- **Color with design system** - `text-primary`, `text-foreground`, `text-foreground-60`
|
|
46
|
+
- **Validate icon names** - Run `npm run lint:icon-names` to verify
|
|
47
|
+
|
|
48
|
+
### No Emojis
|
|
49
|
+
|
|
50
|
+
- **Never use emojis in code** - No emoji characters in any code files
|
|
51
|
+
- **Never use emojis in components** - No emoji in templates, content, or UI elements
|
|
52
|
+
- **Never use emojis in content** - No emoji in text, descriptions, or user-facing content
|
|
53
|
+
- **Use Modus icons instead** - Replace emojis with appropriate Modus icons
|
|
54
|
+
- **Use Unicode characters for symbols** - Use proper Unicode symbols when needed
|
|
55
|
+
|
|
56
|
+
## Angular Integration Patterns
|
|
57
|
+
|
|
58
|
+
### Core Integration
|
|
59
|
+
|
|
60
|
+
- **Use wrapper components** - Always use `<modus-button>`, not `<modus-wc-button>` directly
|
|
61
|
+
- **Signal-based API** - Use `input()`, `output()`, `signal()`, `computed()`
|
|
62
|
+
- **OnPush change detection** - All components use `ChangeDetectionStrategy.OnPush`
|
|
63
|
+
- **Event handling** - Extract `event.detail` from CustomEvent when needed
|
|
64
|
+
- **Modern control flow** - Use `@if`, `@for`, `@switch`, not `*ngIf`, `*ngFor`
|
|
65
|
+
- **inject() for DI** - Use `inject()` function, not constructor injection
|
|
66
|
+
|
|
67
|
+
### Angular Best Practices
|
|
68
|
+
|
|
69
|
+
- **Single configurable components** - One component with variants, not multiple specific components
|
|
70
|
+
- **Use design system colors only** - Never use generic Tailwind colors or hardcoded values
|
|
71
|
+
- **Component composition pattern** - Build complex components from smaller, reusable pieces
|
|
72
|
+
- **Theme-aware components** - Use theme context for conditional styling and content
|
|
73
|
+
- **Performance optimization** - Use computed signals and lazy loading where appropriate
|
|
74
|
+
|
|
75
|
+
### Signal Patterns
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// Signal-based inputs
|
|
79
|
+
readonly color = input<ButtonColor>('primary');
|
|
80
|
+
readonly disabled = input<boolean>(false);
|
|
81
|
+
|
|
82
|
+
// Signal-based outputs
|
|
83
|
+
readonly buttonClick = output<MouseEvent | KeyboardEvent>();
|
|
84
|
+
|
|
85
|
+
// Writable signals for local state
|
|
86
|
+
readonly isOpen = signal(false);
|
|
87
|
+
|
|
88
|
+
// Computed for derived state
|
|
89
|
+
readonly isDisabled = computed(() => this.disabled() || this.loading());
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Component-Specific Rules
|
|
93
|
+
|
|
94
|
+
### Accordion State Management
|
|
95
|
+
|
|
96
|
+
- **Let Modus components manage their own state** - Don't try to control accordion state from Angular
|
|
97
|
+
- **Use `expanded` for initial state only** - Set initial state, then let component handle changes
|
|
98
|
+
- **Use `(expandedChange)` for tracking** - Monitor state changes without controlling them
|
|
99
|
+
- **Use ViewChild for programmatic control** - Access component methods when needed
|
|
100
|
+
- **Avoid real-time synchronization** - Don't sync Angular state with accordion state
|
|
101
|
+
|
|
102
|
+
### Checkbox Value Inversion
|
|
103
|
+
|
|
104
|
+
- **Always invert checkbox value property** - `const actualChecked = !value` from `inputChange` event
|
|
105
|
+
- **Use wrapper components** - Create Angular wrapper to handle inversion automatically
|
|
106
|
+
- **Never trust the raw value** - The `value` property is inverted (false when checked, true when unchecked)
|
|
107
|
+
- **Handle in event handlers** - Invert value in `(inputChange)` event handler
|
|
108
|
+
- **Test thoroughly** - Verify checkbox behavior matches expected state
|
|
109
|
+
|
|
110
|
+
### Modal Implementation
|
|
111
|
+
|
|
112
|
+
- **Use document.getElementById for modal access** - Get the dialog element by ID
|
|
113
|
+
- **Type-safe access** - Cast to `HTMLDialogElement | null`
|
|
114
|
+
- **Check method existence** - `typeof dialog.showModal === 'function'`
|
|
115
|
+
- **Use native dialog API** - `dialog.showModal()` and `dialog.close()`
|
|
116
|
+
- **Never use querySelector with web component selectors**
|
|
117
|
+
- **Descriptive, kebab-case modal IDs**
|
|
118
|
+
|
|
119
|
+
### Select vs Dropdown Menu
|
|
120
|
+
|
|
121
|
+
- **Prefer ModusDropdownMenu** - More reliable event handling than ModusSelect
|
|
122
|
+
- **Reliable itemSelect events** - ModusDropdownMenu provides consistent event handling
|
|
123
|
+
- **Proper state management** - Use Angular signals to track selected values and visibility
|
|
124
|
+
- **Programmatic control** - Use `menuVisible` property for control
|
|
125
|
+
- **Test thoroughly** - Verify dropdown behavior and event handling
|
|
126
|
+
|
|
127
|
+
### Button Group Usage
|
|
128
|
+
|
|
129
|
+
- **Don't set defaults for variant/color in button wrapper** - Allows group to control
|
|
130
|
+
- **Inside button group**: Do NOT set variant/color on individual buttons
|
|
131
|
+
- **Standalone buttons**: Explicitly set variant and color
|
|
132
|
+
- **Group controls all button styling** via DOM manipulation
|
|
133
|
+
|
|
134
|
+
## HTML and Styling
|
|
135
|
+
|
|
136
|
+
### Semantic HTML
|
|
137
|
+
|
|
138
|
+
- **Use div elements only** - All content must use `<div>` elements
|
|
139
|
+
- **No semantic HTML elements** - Never use `h1`, `p`, `section`, `header`, `footer`, `nav`, `main`, `aside`, `article`, `span`
|
|
140
|
+
- **Use Tailwind classes for styling** - Apply typography and layout with Tailwind classes
|
|
141
|
+
- **Icon exception** - Only `<i>` elements allowed for Modus icons
|
|
142
|
+
- **Consistent structure** - Maintain consistent div-based component structure
|
|
143
|
+
|
|
144
|
+
### Tailwind Usage
|
|
145
|
+
|
|
146
|
+
- **Tailwind v4 with design system** - Use Tailwind v4 with Modus Design System integration
|
|
147
|
+
- **No generic Tailwind colors** - Never use `bg-blue-500`, `text-gray-600`, etc.
|
|
148
|
+
- **Use design system colors** - `bg-background`, `text-foreground`, `bg-primary`, etc.
|
|
149
|
+
- **Custom utilities for borders** - Use `border-default`, `border-success`, `border-warning`, etc.
|
|
150
|
+
- **Custom utilities for opacity** - Use `text-foreground-80`, not `text-foreground/80`
|
|
151
|
+
- **Test in all themes** - Ensure Tailwind classes work in all 6 themes
|
|
152
|
+
|
|
153
|
+
## Theming
|
|
154
|
+
|
|
155
|
+
### Theme Implementation
|
|
156
|
+
|
|
157
|
+
- **6 Modus themes supported** - Classic Light/Dark, Modern Light/Dark, Connect Light/Dark
|
|
158
|
+
- **Use data-theme attribute** - `data-theme="modus-classic-light"` on document
|
|
159
|
+
- **Theme persistence** - Save to localStorage and restore on page load
|
|
160
|
+
- **Theme-aware components** - Use computed signals for theme-specific styling
|
|
161
|
+
- **Test all themes** - Verify components work in all 6 themes
|
|
162
|
+
|
|
163
|
+
## Development Workflow
|
|
164
|
+
|
|
165
|
+
### Quality Assurance
|
|
166
|
+
|
|
167
|
+
- **Run linting commands during development** - `npm run lint:all` before commits
|
|
168
|
+
- **Fix violations before committing** - No violations in committed code
|
|
169
|
+
- **Check inline styles** - `npm run lint:styles` to catch inline style violations
|
|
170
|
+
- **Verify design system colors** - `npm run lint:colors` for color compliance
|
|
171
|
+
- **Validate Modus icons** - `npm run lint:icons` for icon usage
|
|
172
|
+
- **Verify border usage** - `npm run lint:borders` for border compliance
|
|
173
|
+
- **Check opacity utilities** - `npm run lint:opacity` for opacity compliance
|
|
174
|
+
- **TypeScript validation** - `npm run type-check` for type errors
|
|
175
|
+
|
|
176
|
+
### Testing
|
|
177
|
+
|
|
178
|
+
- **Use Chrome DevTools MCP** - Real-time browser debugging
|
|
179
|
+
- **Test before completion** - Validate all implementations in browser
|
|
180
|
+
- **Check console for errors** - Look for JavaScript errors and warnings
|
|
181
|
+
- **Test interactive elements** - Verify Modus Web Components work correctly
|
|
182
|
+
- **Performance testing** - Use DevTools for performance analysis
|
|
183
|
+
- **Test all 6 themes** - Verify components work in all themes
|
|
184
|
+
|
|
185
|
+
### Linting Commands
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
npm run lint:styles # Check inline styles
|
|
189
|
+
npm run lint:colors # Check color usage
|
|
190
|
+
npm run lint:icons # Check icon usage
|
|
191
|
+
npm run lint:borders # Check border violations
|
|
192
|
+
npm run lint:opacity # Check opacity utilities
|
|
193
|
+
npm run lint:icon-names # Validate icon names
|
|
194
|
+
npm run type-check # TypeScript validation
|
|
195
|
+
npm run lint:all # Run all checks
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Quick Reference
|
|
199
|
+
|
|
200
|
+
### Correct Patterns
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
// Signal-based component
|
|
204
|
+
@Component({
|
|
205
|
+
selector: 'app-example',
|
|
206
|
+
template: `
|
|
207
|
+
<div class="bg-background text-foreground p-4">
|
|
208
|
+
@if (isVisible()) {
|
|
209
|
+
<modus-button
|
|
210
|
+
[color]="color()"
|
|
211
|
+
[disabled]="disabled()"
|
|
212
|
+
(buttonClick)="handleClick($event)"
|
|
213
|
+
>
|
|
214
|
+
{{ buttonText() }}
|
|
215
|
+
</modus-button>
|
|
216
|
+
}
|
|
217
|
+
</div>
|
|
218
|
+
`,
|
|
219
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
220
|
+
})
|
|
221
|
+
export class ExampleComponent {
|
|
222
|
+
readonly color = input<ButtonColor>('primary');
|
|
223
|
+
readonly disabled = input<boolean>(false);
|
|
224
|
+
readonly buttonText = input<string>('Click Me');
|
|
225
|
+
readonly isVisible = signal(true);
|
|
226
|
+
|
|
227
|
+
handleClick(event: MouseEvent | KeyboardEvent): void {
|
|
228
|
+
console.log('Button clicked:', event);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Forbidden Patterns
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
// WRONG: Generic Tailwind colors
|
|
237
|
+
template: `<div class="bg-blue-500 text-white">`
|
|
238
|
+
|
|
239
|
+
// WRONG: Semantic HTML
|
|
240
|
+
template: `<h1>Title</h1><p>Content</p>`
|
|
241
|
+
|
|
242
|
+
// WRONG: Opacity with / syntax
|
|
243
|
+
template: `<div class="text-foreground/80">`
|
|
244
|
+
|
|
245
|
+
// WRONG: Tailwind border colors
|
|
246
|
+
template: `<div class="border-red-500">`
|
|
247
|
+
|
|
248
|
+
// WRONG: Direct web component usage
|
|
249
|
+
template: `<modus-wc-button>`
|
|
250
|
+
|
|
251
|
+
// WRONG: @Input() decorator
|
|
252
|
+
@Input() color: string;
|
|
253
|
+
|
|
254
|
+
// WRONG: *ngIf directive
|
|
255
|
+
template: `<div *ngIf="condition">`
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Reference
|
|
259
|
+
|
|
260
|
+
This rule consolidates all essential Modus Angular development guidelines. For detailed patterns, examples, and advanced techniques, refer to the individual rule files:
|
|
261
|
+
|
|
262
|
+
- `modus-angular-20.mdc` - Angular 20 patterns
|
|
263
|
+
- `modus-angular-design-system.mdc` - Colors, opacity, borders
|
|
264
|
+
- `modus-angular-integration.mdc` - Wrapper component patterns
|
|
265
|
+
- `modus-angular-icons.mdc` - Icon usage
|
|
266
|
+
- `modus-angular-accordion-state-management.mdc` - Accordion state
|
|
267
|
+
- `modus-angular-checkbox-value-inversion.mdc` - Checkbox bug handling
|
|
268
|
+
- `modus-angular-button-group-usage.mdc` - Button group patterns
|
|
269
|
+
- `modus-angular-select-vs-dropdown-menu.mdc` - Dropdown patterns
|
|
270
|
+
- `modus-angular-semantic-html.mdc` - Div-only HTML
|
|
271
|
+
- `modus-angular-development-workflow.mdc` - Linting and workflow
|
|
272
|
+
- `modus-angular-chrome-devtools-testing.mdc` - Testing patterns
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Comprehensive rules for implementing forms and validation in Angular with Modus
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Forms Validation - Short
|
|
8
|
+
|
|
9
|
+
Essential patterns for forms and validation with Modus Web Components.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Always use Reactive Forms** - Don't use template-driven forms
|
|
14
|
+
- **Track touched state manually** - Modus components don't integrate with Angular form state
|
|
15
|
+
- **Use computed signals for feedback** - Reactive, efficient validation
|
|
16
|
+
- **Check touched state before showing errors** - Better UX
|
|
17
|
+
- **Handle both inputChange and inputBlur** - Complete interaction tracking
|
|
18
|
+
- **Extract event.detail** - Correct event handling pattern
|
|
19
|
+
|
|
20
|
+
## Manual Touch Tracking
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
readonly touchedFields = signal<Set<string>>(new Set());
|
|
24
|
+
|
|
25
|
+
handleFieldChange(event: InputEvent, fieldName: string): void {
|
|
26
|
+
const target = event.target as HTMLInputElement;
|
|
27
|
+
this.form.controls[fieldName].setValue(target.value);
|
|
28
|
+
this.markFieldTouched(fieldName);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private markFieldTouched(fieldName: string): void {
|
|
32
|
+
this.touchedFields.update((fields) => {
|
|
33
|
+
const newFields = new Set(fields);
|
|
34
|
+
newFields.add(fieldName);
|
|
35
|
+
return newFields;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Validation Feedback
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
readonly emailFeedback = computed<IInputFeedbackProp | undefined>(() => {
|
|
44
|
+
const control = this.form.controls.email;
|
|
45
|
+
const isTouched = this.touchedFields().has('email');
|
|
46
|
+
if (!isTouched || !control.errors) return undefined;
|
|
47
|
+
if (control.errors['required']) {
|
|
48
|
+
return { level: 'error', message: 'Email is required.' };
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Reference
|
|
55
|
+
|
|
56
|
+
For detailed form patterns and validation strategies, fetch the full rule: `modus-angular-forms-validation`
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Comprehensive rules for implementing forms and validation in Angular with Modus Web Components
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Forms and Validation Rules
|
|
8
|
+
|
|
9
|
+
Comprehensive guide for implementing forms and validation in Angular applications with Modus Web Components.
|
|
10
|
+
|
|
11
|
+
## Core Principles
|
|
12
|
+
|
|
13
|
+
### ALWAYS Use Reactive Forms
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
17
|
+
|
|
18
|
+
@Component({
|
|
19
|
+
imports: [ReactiveFormsModule],
|
|
20
|
+
})
|
|
21
|
+
export class MyFormComponent {
|
|
22
|
+
private readonly fb = new FormBuilder();
|
|
23
|
+
|
|
24
|
+
readonly form = this.fb.group({
|
|
25
|
+
email: ['', [Validators.required, Validators.email]],
|
|
26
|
+
password: ['', [Validators.required, Validators.minLength(8)]],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## CRITICAL: Track Touched State Manually
|
|
32
|
+
|
|
33
|
+
**Modus Web Components don't automatically track Angular form touched state.** You must manually track which fields have been touched.
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
export class FormComponent {
|
|
37
|
+
readonly touchedFields = signal<Set<string>>(new Set());
|
|
38
|
+
|
|
39
|
+
handleFieldChange(event: InputEvent, fieldName: string): void {
|
|
40
|
+
const target = event.target as HTMLInputElement;
|
|
41
|
+
const control = this.form.controls[fieldName];
|
|
42
|
+
control.setValue(target.value);
|
|
43
|
+
this.markFieldTouched(fieldName);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
handleFieldBlur(fieldName: string): void {
|
|
47
|
+
this.markFieldTouched(fieldName);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private markFieldTouched(fieldName: string): void {
|
|
51
|
+
this.touchedFields.update((fields) => {
|
|
52
|
+
const newFields = new Set(fields);
|
|
53
|
+
newFields.add(fieldName);
|
|
54
|
+
return newFields;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Validation Feedback Pattern
|
|
61
|
+
|
|
62
|
+
### Use Computed Signals for Validation Feedback
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
readonly emailFeedback = computed<IInputFeedbackProp | undefined>(() => {
|
|
66
|
+
const control = this.form.controls.email;
|
|
67
|
+
const isTouched = this.touchedFields().has('email');
|
|
68
|
+
|
|
69
|
+
if (!isTouched || !control.errors) return undefined;
|
|
70
|
+
|
|
71
|
+
if (control.errors['required']) {
|
|
72
|
+
return { level: 'error', message: 'Email address is required.' };
|
|
73
|
+
}
|
|
74
|
+
if (control.errors['email']) {
|
|
75
|
+
return { level: 'error', message: 'Please enter a valid email address.' };
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Connecting Modus Components to Forms
|
|
82
|
+
|
|
83
|
+
### Text Inputs
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
readonly firstNameFeedback = computed<IInputFeedbackProp | undefined>(() => {
|
|
87
|
+
const control = this.form.controls.firstName;
|
|
88
|
+
const isTouched = this.touchedFields().has('firstName');
|
|
89
|
+
if (!isTouched || !control.errors) return undefined;
|
|
90
|
+
if (control.errors['required']) {
|
|
91
|
+
return { level: 'error', message: 'First name is required.' };
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
handleFirstNameChange(event: InputEvent): void {
|
|
97
|
+
const target = event.target as HTMLInputElement;
|
|
98
|
+
this.form.controls.firstName.setValue(target.value);
|
|
99
|
+
this.markFieldTouched('firstName');
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<modus-text-input
|
|
105
|
+
inputId="firstName"
|
|
106
|
+
placeholder="Enter first name"
|
|
107
|
+
[required]="true"
|
|
108
|
+
[value]="form.controls.firstName.value ?? ''"
|
|
109
|
+
[feedback]="firstNameFeedback()"
|
|
110
|
+
(inputChange)="handleFirstNameChange($event.detail)"
|
|
111
|
+
(inputBlur)="handleFirstNameBlur()"
|
|
112
|
+
/>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Best Practices Summary
|
|
116
|
+
|
|
117
|
+
1. **ALWAYS use Reactive Forms** - Don't use template-driven forms
|
|
118
|
+
2. **ALWAYS track touched state manually** - Modus components don't integrate automatically
|
|
119
|
+
3. **ALWAYS use computed signals for feedback** - Reactive, efficient validation
|
|
120
|
+
4. **ALWAYS check touched state before showing errors** - Better UX
|
|
121
|
+
5. **ALWAYS use specific error messages** - Helpful, clear feedback
|
|
122
|
+
6. **ALWAYS handle both inputChange and inputBlur** - Complete interaction tracking
|
|
123
|
+
7. **ALWAYS extract event.detail** - Correct event handling
|
|
124
|
+
8. **ALWAYS use null coalescing for value bindings** - `form.controls.field.value ?? ''`
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Complete list of valid Modus icon names for Angular applications
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Complete Icon Names List
|
|
8
|
+
|
|
9
|
+
**Only these names are allowed** when using Modus icons. Always verify icon names against this list before using them.
|
|
10
|
+
|
|
11
|
+
### A-C
|
|
12
|
+
|
|
13
|
+
accessibility, accessibility_circle, add, add_bold, add_circle, add_heavy, address, advanced_instructions, alarm_add, alarm_off, alarm_on, alert, alert_outlined, align_bottom, align_center_horiz, align_center_vert, align_left, align_right, align_top, angle_90, antenna, apps, arc, arrow_back, arrow_down, arrow_down_circle, arrow_expand_diagonal_left, arrow_expand_diagonal_right, arrow_left, arrow_left_circle, arrow_next, arrow_right, arrow_right_circle, arrow_up, arrow_up_circle, artificial_intelligence, backup_restore_cloud, backup_restore_file, bar_graph, bar_graph_line, bar_graph_square, barcode, battery_0_horizontal, battery_0_vertical, battery_25_horizontal, battery_25_vertical, battery_50_horizontal, battery_50_vertical, battery_75_horizontal, battery_75_vertical, battery_charging_horizontal, battery_charging_vertical, battery_full_horizontal, battery_full_vertical, between, bolt, bookings, bookings_open, box_select, briefcase, brightness, brush, bug, bug_report, building_corporate, buildings, calculate, calculator, calculator_symbols, calendar, calendar_add, calendar_and_key, calendar_blank, calendar_booking, calendar_cancel, calendar_check, calendar_clock, calendar_event, calendar_loading_unloading, calendar_loading_unloading_date, calendar_plus, calendar_rebook, calendar_reserve, calendar_show, calendar_time_slot, calendar_week, camera, camera_disabled, camera_photo_add, cancel_circle, cancel_square, cancel_square_outlined, caret_down, caret_down_bold, caret_left, caret_left_bold, caret_right, caret_right_bold, caret_up, caret_up_bold, cell_merge, cell_properties, cell_split, certificate, chat, check, check_bold, check_circle, check_circle_outlined, check_heavy, chevron_double_down, chevron_double_left, chevron_double_right, chevron_double_up, chevron_left, chevron_left_bold, chevron_right, chevron_right_bold, circle_notch, circle_outline, clipboard, clipboard_actions, clipboard_check, clipboard_empty, clipboard_planning, clock, clock_add, clock_checkmark, clock_delay_warning, clock_delayed, clock_locked, clock_question_mark, close, close_bold, close_heavy, cloud, cloud_connected, cloud_disconnected, cloud_download, cloud_upload, code, coffee_cup, collapse, collapse_bold, color_picker, column_copy, column_cut, column_delete, column_insert_after, column_insert_before, column_paste_after, column_paste_before, column_properties, columns, combine, comment, comment_add, comment_empty, comment_message, comment_message_disabled, compare_arrows, compass, component, contacts, contrast, copy_content, costs, credit_card, crop, cube, curly_brackets, cursor, cursor_add, cursor_remove
|
|
14
|
+
|
|
15
|
+
### D-H
|
|
16
|
+
|
|
17
|
+
dashboard, data_missing, data_transfer_off, day_mostly_cloudy, day_partly_cloudy, delete, delivery_truck, delivery_truck_allocate, delivery_truck_motion, document, download, download_line, download_xls, drag_corner, drag_horizontal, drag_indicator, drag_vertical, drivers, drizzle, drone, earnings_statement, edit_combination, email, email_add, envelope, eraser, exclamation_mark, expand, expand_bold, expand_less, expand_less_bold, expand_less_circle, expand_more, expand_more_bold, expand_more_circle, export, factory, fast_forward, fast_rewind, file, file_bar_graph, file_check_in, file_check_out, file_cloud, file_copy, file_edit, file_merge, file_missing, file_new, file_secure, file_table, file_type_bmpf, file_type_csv, file_type_cur, file_type_doc, file_type_ico, file_type_key, file_type_log, file_type_numbers, file_type_pdf, file_type_pem, file_type_rfi, file_type_rfq, file_type_rtf, file_type_text, file_type_tif, file_type_tmp, file_type_xls, filter, filter_list, filter_off, first_page, flag, flag_finish, floorplan, flowchart, fog, folder_closed, folder_locked, folder_new, folder_open, folder_personal, folder_project, folder_public, folder_share, folder_unlocked, footprints, forestry, forklift, frame, freight_market, freight_matching, freight_trolley, full_screen, function, gantt_chart, gavel, gears, greater_than_equal_to, group_items, hail, hail_heavy, hail_light, hammer, hand, hard_hat, headset, heart, helicopter, help, help_outlined, history, home, hourglass
|
|
18
|
+
|
|
19
|
+
### I-O
|
|
20
|
+
|
|
21
|
+
ice, icons_shapes, image, image_add, image_disabled, image_scene, in_cab_device, in_field_device, info, info_outlined, info_token, inspect, invoice, invoice_euro, invoice_pound, invoice_yen, item_begins_with, item_contains, item_does_not_contain, item_does_not_equal, item_ends_with, item_equals, key, keyboard, keyboard_keys, labs, language, last_page, launch, launch_bold, layer, learn, less_than_equal_to, lightbulb_off, lightbulb_on, lightning, line_diagonal, line_graph, link, link_broken, link_off, list_bulleted, list_numbered, list_shapes, location, location_add, location_add_multiple, location_arrow, location_disabled, location_point, lock, lock_open, magic_wand, manage_accounts, manage_people, map, map_2d, map_marker, map_marker_circle, map_marker_multiple, map_markers, map_poi, master_data, megaphone, menu, menu_circle, mic, mix, mobile_app_version, monetarization, moon, more_circle, more_horizontal, more_vertical, mouse, move, move_last_down, move_last_left, move_last_right, move_last_up, night_mostly_cloudy, night_partly_cloudy, no_package, no_truck, not_synced_bold, notifications, notifications_off, object_mirror, object_outline, object_rotate, offers, overcast
|
|
22
|
+
|
|
23
|
+
### P-S
|
|
24
|
+
|
|
25
|
+
package, package_delivered, package_delivery, package_missing, package_pickup, package_sent, pager, paint_bucket, palette, pan, paper_plane, paperclip, password, pause_circle, payment_instant, pen, pencil, people_add, people_couple, people_group, person, person_account, person_add, person_clock, person_edit, person_remove, phone, phone_call, phone_hang_up, phone_mobile, pin, pin_add, pin_straight, pin_straight_cancel, play_circle, point_marker_tool, polygon, polygon_area_tool, polygon_concave, polygon_cone, polygon_drag_rectangle, polygon_line_tool, polygon_merge, polygon_select, printer, pulse, qr_code, question, quick_login, rain, rain_heavy, rain_icy, raindrop, redo, redo_bold, refresh, refresh_bold, remove, remove_bold, remove_circle, remove_heavy, reply, rewind, row_add, row_copy, row_cut, row_delete, row_highlighted, row_insert_after, row_insert_before, row_paste_after, row_paste_before, row_properties, row_remove, rows_show_less, rows_show_more, rss_feed, ruler, satellite, save_as, save_disk, scan_barcode, schema, scissors, screen, screenshot, search, server, server_round, settings, share, shield, shopping_cart, shopping_cart_minus, shopping_cart_plus, shortcut, shovel, show_less_caret, show_more_caret, sign_in, sign_out, signal, smiley_dissatisfied, smiley_dissatisfied_outlined, smiley_neutral, smiley_neutral_outlined, smiley_satisfied, smiley_satisfied_outlined, smiley_somewhat_dissatisfied, smiley_somewhat_dissatisfied_outlined, smiley_somewhat_satisfied, smiley_somewhat_satisfied_outlined, snow_heavy, snow_light, snow_particle, snowflake, snowflakes, sort, sort_alpha_down, sort_alpha_up, sort_arrow_down, sort_arrow_up, sort_down, sort_up, star, star_half, star_locked, star_northern, star_outlined, stars, stop_circle, street_measurement, submit_expense, sun, swap, switch_account, switch_left, switch_right, sync, sync_bold, sync_off
|
|
26
|
+
|
|
27
|
+
### T-Z and Numbers
|
|
28
|
+
|
|
29
|
+
table, tablet, tag, tag_disabled, template, text_align_left, text_align_right, text_bold, text_centered, text_grow, text_input, text_input_long, text_input_short, text_italic, text_marker, text_shrink, text_strikethrough, text_truncated, text_underlined, thermometer_cold, thermometer_hot, thumbs_down, thumbs_up, thunderstorm_heavy, thunderstorm_light, ticket, ticket_plane, time_off_work, time_slot_not_reserved, time_slot_reserved, timer, timer_countdown, timesheet, timesheet_approve, toggle_center, toggle_left_panel, toggle_off, toggle_on, toggle_right_panel, traffic_cone, tree_structure, triangle_down, triangle_left, triangle_right, triangle_up, trimble_logo, truck_add, truck_warning_delay, tune, tune_circle, uncombine, undo, undo_bold, unfold_less, unfold_more, unit_selector, unsorted_arrows, update, upload, upload_xls, user_account, user_active, user_guide, user_inactive, user_passkey, user_permissions, video, video_add, video_disabled, view_grid, view_list, visibility_off, visibility_on, volume_down, volume_mute, volume_up, vr_xr, warehouse, warning, warning_outlined, web, wheelbarrow, widgets, wifi, wifi_no_internet, wifi_off, wind, window, window_dock_undock, window_fit, window_resize, window_side_panel, window_template, window_views, window_wireframe, wintery_mix, wrench, zoom_box, zoom_in, zoom_out, 2_layers, 2_layers_off, 360, add_square, archive_square, auto_target, avoidance_zone, background_dark, background_light, base_station, bullseye, bullseye_off, bullseye_warning, clip, compactor, corner, dashboard_tiles, design_package, device_cb460, device_tsc7, devices_group, devices_status, dozer, easting, edit_mode, electric_meter_off, electric_meter_off_outline, electric_meter_outline_rounded, electric_meter_rounded, electric_meter_rounded_warn, elevation, gnss, gnss_r8, gnss_r8s_base, gnss_rpt, gnss_rts, gnss_sps986, gps, grader, hex, horizontal_accuracy, image_square, image_square_off, image_square_off_outline, image_square_outline, machine, machines, measure_up, northing, orbit, orthogonal, perspective, prism_pole, prism_pole_extend, receiver_generic_error_filled, receiver_generic_error_outline, receiver_generic_filled, receiver_generic_off_filled, receiver_generic_off_outline, receiver_generic_outline, receiver_generic_warn_filled, receiver_generic_warn_outline, ri, rpt, rts, rts_off, rts_rpt, select_area, sx10, sync_filled, todo, todo_add, total_station, total_station_lost, unarchive_square, vertical_accuracy, view_2_rows, view_3_column, visibility_part_outline, workers_queue, x12, x7, x7_card, x7_settings, xr10, zoom_center
|
|
30
|
+
|
|
31
|
+
## Icon Categories by Usage
|
|
32
|
+
|
|
33
|
+
### Navigation & UI
|
|
34
|
+
|
|
35
|
+
`arrow_left`, `arrow_right`, `arrow_up`, `arrow_down`, `chevron_left`, `chevron_right`, `menu`, `close`, `home`, `settings`, `search`
|
|
36
|
+
|
|
37
|
+
### Actions & Operations
|
|
38
|
+
|
|
39
|
+
`add`, `remove`, `edit_combination`, `delete`, `save_disk`, `download`, `upload`, `copy_content`
|
|
40
|
+
|
|
41
|
+
### Status & Feedback
|
|
42
|
+
|
|
43
|
+
`check`, `check_circle`, `warning`, `alert`, `info`, `cancel_circle`, `help`
|
|
44
|
+
|
|
45
|
+
### Files & Documents
|
|
46
|
+
|
|
47
|
+
`file`, `folder_open`, `folder_closed`, `document`, `image`, `video`
|
|
48
|
+
|
|
49
|
+
### Communication
|
|
50
|
+
|
|
51
|
+
`email`, `phone`, `chat`, `comment`, `notifications`
|
|
52
|
+
|
|
53
|
+
### Time & Calendar
|
|
54
|
+
|
|
55
|
+
`calendar`, `clock`, `timer`, `history`
|
|
56
|
+
|
|
57
|
+
### User & Account
|
|
58
|
+
|
|
59
|
+
`person`, `people_group`, `user_account`, `key`, `lock`
|
|
60
|
+
|
|
61
|
+
### Data & Analytics
|
|
62
|
+
|
|
63
|
+
`bar_graph`, `line_graph`, `dashboard`
|
|
64
|
+
|
|
65
|
+
## Validation
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Validate icon names used in templates
|
|
69
|
+
npm run lint:icon-names
|
|
70
|
+
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Modus Icons usage guide for Angular applications
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Icons - Short
|
|
8
|
+
|
|
9
|
+
Essential icon usage rules for Modus Design System in Angular.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use Modus icons exclusively** - `<i class="modus-icons">icon_name</i>`
|
|
14
|
+
- **Use UNDERSCORES in names** - `save_disk`, `arrow_left`, NOT `save-disk`, `arrow-left`
|
|
15
|
+
- **Never use other icon libraries** - No Font Awesome, Material Icons, Heroicons
|
|
16
|
+
- **Use valid icon names only** - Check modus-angular-icon-names.mdc for valid names
|
|
17
|
+
- **Size with Tailwind classes** - `text-sm`, `text-lg`, `text-xl` for sizing
|
|
18
|
+
- **Color with design system** - `text-primary`, `text-foreground`, `text-muted-foreground`
|
|
19
|
+
|
|
20
|
+
## Usage Patterns
|
|
21
|
+
|
|
22
|
+
```html
|
|
23
|
+
<!-- Direct HTML usage -->
|
|
24
|
+
<i class="modus-icons text-lg" aria-hidden="true">save_disk</i>
|
|
25
|
+
<i class="modus-icons text-base" role="img" aria-label="Settings">settings</i>
|
|
26
|
+
|
|
27
|
+
<!-- In buttons -->
|
|
28
|
+
<modus-button icon="save_disk" iconPosition="left">Save</modus-button>
|
|
29
|
+
<modus-button icon="settings" iconPosition="only" ariaLabel="Settings"></modus-button>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Common Icons
|
|
33
|
+
|
|
34
|
+
- **Navigation:** `arrow_left`, `arrow_right`, `chevron_left`, `chevron_right`, `menu`, `close`
|
|
35
|
+
- **Actions:** `add`, `add_circle`, `edit`, `delete`, `save_disk`, `download`, `upload`
|
|
36
|
+
- **Status:** `check`, `check_circle`, `error`, `warning`, `info`, `help`
|
|
37
|
+
|
|
38
|
+
## Reference
|
|
39
|
+
|
|
40
|
+
For complete icon list and accessibility guidelines, fetch the full rule: `modus-angular-icons`
|