@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,235 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: UI/UX Foundations for AI Agents with Modus 2 + Tailwind v4
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# UI/UX Foundations for AI Agents
|
|
8
|
+
|
|
9
|
+
**Scope**: Modus 2 Angular Components + Tailwind v4 (Real Config Alignment)
|
|
10
|
+
|
|
11
|
+
> This file is grounded in your **real Modus 2 Angular + Tailwind v4 setup**. It uses the exact variables, color tokens, and CSS conventions from your implementation.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Foundation & Setup
|
|
16
|
+
|
|
17
|
+
## 1 Color System — From Angular Design System
|
|
18
|
+
|
|
19
|
+
### Semantic Mapping
|
|
20
|
+
|
|
21
|
+
Use Tailwind v4 tokens defined in your `src/styles.css`. **Do not use arbitrary colors.**
|
|
22
|
+
|
|
23
|
+
| Purpose | Tailwind Token | CSS Variable (from src/styles.css) |
|
|
24
|
+
| ---------- | -------------------------------------------- | ---------------------------------------------------------- |
|
|
25
|
+
| Background | `bg-background` | `--background` → `var(--modus-wc-color-base-page)` |
|
|
26
|
+
| Foreground | `text-foreground` | `--foreground` → `var(--modus-wc-color-base-content)` |
|
|
27
|
+
| Card | `bg-card` | `--card` → `var(--modus-wc-color-base-100)` |
|
|
28
|
+
| Card Text | `text-card-foreground` | `--card-foreground` → `var(--modus-wc-color-base-content)` |
|
|
29
|
+
| Primary | `bg-primary` / `text-primary-foreground` | `--primary` → `var(--modus-wc-color-info)` |
|
|
30
|
+
| Secondary | `bg-secondary` / `text-secondary-foreground` | `--secondary` → `var(--modus-wc-color-base-300)` |
|
|
31
|
+
| Muted | `bg-muted` / `text-muted-foreground` | `--muted` → `var(--modus-wc-color-base-200)` |
|
|
32
|
+
| Success | `bg-success` / `text-success-foreground` | `--success` → `var(--modus-wc-color-success)` |
|
|
33
|
+
| Warning | `bg-warning` / `text-warning-foreground` | `--warning` → `var(--modus-wc-color-warning)` |
|
|
34
|
+
| Error | `bg-error` / `text-error-foreground` | `--error` → `var(--modus-wc-color-error)` |
|
|
35
|
+
| Border | `border-border` | `--border` → `var(--modus-wc-color-base-200)` |
|
|
36
|
+
| Ring | `ring` | `--ring` → `var(--modus-wc-color-info)` |
|
|
37
|
+
|
|
38
|
+
**Rules:**
|
|
39
|
+
|
|
40
|
+
- Never use `#hex`, RGB, or inline color CSS.
|
|
41
|
+
- All visual hierarchy comes from semantic tokens.
|
|
42
|
+
- Respect light/dark context (CSS variables auto-handle switching).
|
|
43
|
+
- Use custom border utilities (`.border-default`, `.border-primary`, etc.) for Tailwind v4 compatibility.
|
|
44
|
+
- Use opacity utilities (`.text-foreground-80`, `.bg-primary-20`, etc.) for transparency.
|
|
45
|
+
|
|
46
|
+
## 2 Tailwind v4 Configuration
|
|
47
|
+
|
|
48
|
+
Tailwind v4 reads CSS variables directly from `src/styles.css`. No separate `tailwind.config.js` is required.
|
|
49
|
+
|
|
50
|
+
All colors are defined in `src/styles.css` under `:root`:
|
|
51
|
+
|
|
52
|
+
```css
|
|
53
|
+
:root {
|
|
54
|
+
--background: var(--modus-wc-color-base-page);
|
|
55
|
+
--foreground: var(--modus-wc-color-base-content);
|
|
56
|
+
--card: var(--modus-wc-color-base-100);
|
|
57
|
+
--card-foreground: var(--modus-wc-color-base-content);
|
|
58
|
+
--muted: var(--modus-wc-color-base-200);
|
|
59
|
+
--muted-foreground: var(--modus-wc-color-base-content);
|
|
60
|
+
--secondary: var(--modus-wc-color-base-300);
|
|
61
|
+
--secondary-foreground: var(--modus-wc-color-base-content);
|
|
62
|
+
--primary: var(--modus-wc-color-info);
|
|
63
|
+
--primary-foreground: var(--modus-wc-color-base-page);
|
|
64
|
+
--success: var(--modus-wc-color-success);
|
|
65
|
+
--success-foreground: var(--modus-wc-color-base-page);
|
|
66
|
+
--warning: var(--modus-wc-color-warning);
|
|
67
|
+
--warning-foreground: var(--modus-wc-color-base-content);
|
|
68
|
+
--error: var(--modus-wc-color-error);
|
|
69
|
+
--error-foreground: var(--modus-wc-color-base-page);
|
|
70
|
+
--border: var(--modus-wc-color-base-200);
|
|
71
|
+
--ring: var(--modus-wc-color-info);
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Custom Utilities Available:**
|
|
76
|
+
|
|
77
|
+
- Border utilities: `.border-default`, `.border-thick`, `.border-primary`, `.border-success`, `.border-warning`, `.border-error`
|
|
78
|
+
- Opacity utilities: `.text-foreground-80`, `.bg-primary-20`, etc. (20%, 40%, 60%, 80% variants for all colors)
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
# Component System
|
|
83
|
+
|
|
84
|
+
## 3 Example Component System — Modus 2 Angular Wrappers
|
|
85
|
+
|
|
86
|
+
**REFERENCE**: For more information reference `docs/angular-design-system.mdc`
|
|
87
|
+
|
|
88
|
+
| Component | Angular Component | Inputs/Props | Usage Rule |
|
|
89
|
+
| --------- | -------------------- | ---------------------------------- | -------------------------------------------------------------------------- |
|
|
90
|
+
| Button | `<modus-button>` | `color`, `variant`, `size`, `icon` | One primary action per surface. Use `color="primary"` for primary actions. |
|
|
91
|
+
| Card | `<modus-card>` | `bordered`, `padding`, `layout` | For grouping or sectioning. Use `bg-card` + `border-border` in slots. |
|
|
92
|
+
| Input | `<modus-text-input>` | `label`, `error`, `disabled` | Must have a visible `label`. Use error state + ARIA bindings. |
|
|
93
|
+
| Select | `<modus-select>` | `options`, `placeholder` | Never rely on placeholder as label. |
|
|
94
|
+
| Table | `<modus-table>` | `columns`, `data`, `sortable` | Include empty and loading states. |
|
|
95
|
+
| Modal | `<modus-modal>` | `isOpen`, `onClose`, `title` | Trap focus. ESC closes. Max 3 actions. |
|
|
96
|
+
| Tabs | `<modus-tabs>` | `tabs`, `activeKey` | Keyboard accessible. |
|
|
97
|
+
| Tooltip | `<modus-tooltip>` | `text`, `position` | Short contextual hints only. |
|
|
98
|
+
| Icon | `<modus-icon>` | `name`, `size`, `variant` | Follows real Modus naming (kebab-case, outlined default). |
|
|
99
|
+
|
|
100
|
+
## 4 Iconography
|
|
101
|
+
|
|
102
|
+
**REFERENCE**: For complete icon usage guidelines see `docs/angular-design-system.mdc`
|
|
103
|
+
|
|
104
|
+
### Import (already handled globally)
|
|
105
|
+
|
|
106
|
+
Modus icons are imported via the Modus Web Components CDN in `src/styles.css`:
|
|
107
|
+
|
|
108
|
+
```css
|
|
109
|
+
@import '@trimble-oss/moduswebcomponents/modus-wc-styles.css';
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Supported Usage Patterns
|
|
113
|
+
|
|
114
|
+
#### A) Angular Component (preferred)
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<!-- Informational icon (announced by screen reader) -->
|
|
118
|
+
<modus-icon name="user-add" size="lg" [decorative]="false" ariaLabel="Add user" />
|
|
119
|
+
|
|
120
|
+
<!-- Decorative icon (not announced) -->
|
|
121
|
+
<modus-icon name="chevron-right" size="md" [decorative]="true" />
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
- **Inputs:** `name` (kebab-case), `size`: `'sm' | 'md' | 'lg'`, `decorative`: boolean.
|
|
125
|
+
- **Accessibility:** If `[decorative]="false"`, include `ariaLabel`.
|
|
126
|
+
- **Do not** pass numeric pixel sizes.
|
|
127
|
+
|
|
128
|
+
#### B) Bare `<i>` Glyph (CDN font)
|
|
129
|
+
|
|
130
|
+
```html
|
|
131
|
+
<!-- Decorative icon -->
|
|
132
|
+
<i class="modus-icons text-lg" aria-hidden="true">user-add</i>
|
|
133
|
+
|
|
134
|
+
<!-- Informational icon -->
|
|
135
|
+
<i class="modus-icons text-md" role="img" aria-label="Settings">settings</i>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
- Size using Tailwind text utilities (`text-sm`, `text-md`, `text-lg`).
|
|
139
|
+
- Keep color semantic (`text-foreground`, `text-muted-foreground`, etc.).
|
|
140
|
+
|
|
141
|
+
### Rules
|
|
142
|
+
|
|
143
|
+
- Naming: **kebab-case** (`file-upload`, `user-add`).
|
|
144
|
+
- Style: outlined default; filled for active/selected states only.
|
|
145
|
+
- One icon per control.
|
|
146
|
+
- In buttons: icon left, `mr-2` or `ml-2` between icon and label, aligned baseline.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
# Design Principles
|
|
151
|
+
|
|
152
|
+
## 5 Gestalt Laws in Practice (UI Layout Rules)
|
|
153
|
+
|
|
154
|
+
**REFERENCE**: For more information referance `.cursor/rules/ux/gestalt-laws-detailed.mdc`
|
|
155
|
+
|
|
156
|
+
| Law | Implementation |
|
|
157
|
+
| ------------------- | ------------------------------------------------------------------------------ |
|
|
158
|
+
| **Proximity** | `gap-2` within a group; `gap-6`–`gap-8` between groups. |
|
|
159
|
+
| **Similarity** | Same purpose = same variant, same size. |
|
|
160
|
+
| **Common Region** | Group with `<modus-card>` and `class="p-6 bg-card border-default rounded-lg"`. |
|
|
161
|
+
| **Figure/Ground** | Use `bg-card` over `bg-background` with shadow or border. |
|
|
162
|
+
| **Continuity** | Maintain alignment using `flex`, `items-start`, `justify-between`. |
|
|
163
|
+
| **Hick's** | Max 3 visible CTAs per context. Overflow extra in menu. |
|
|
164
|
+
| **Fitts's** | Keep primary CTAs near edited content, 44×44px minimum. |
|
|
165
|
+
| **Serial Position** | Primary actions at start or end of flow. |
|
|
166
|
+
| **Prägnanz** | Remove unnecessary divs, borders, or text. Prefer whitespace. |
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
# Implementation Examples
|
|
171
|
+
|
|
172
|
+
## 6 Example Snippets
|
|
173
|
+
|
|
174
|
+
### Form Card
|
|
175
|
+
|
|
176
|
+
```html
|
|
177
|
+
<modus-card class="bg-card border-default rounded-lg">
|
|
178
|
+
<div slot="title" class="text-foreground text-lg font-medium">Profile</div>
|
|
179
|
+
<div slot="actions">
|
|
180
|
+
<modus-button color="primary">Save</modus-button>
|
|
181
|
+
</div>
|
|
182
|
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mt-6">
|
|
183
|
+
<div class="flex flex-col gap-2">
|
|
184
|
+
<label for="email" class="text-sm text-muted-foreground">Email</label>
|
|
185
|
+
<modus-text-input id="email" name="email" type="email" required />
|
|
186
|
+
<div class="text-xs text-muted-foreground">Used for notifications</div>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
</modus-card>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Toolbar
|
|
193
|
+
|
|
194
|
+
```html
|
|
195
|
+
<div class="flex items-center justify-between gap-4 border-bottom-default pb-4">
|
|
196
|
+
<div class="flex items-center gap-2">
|
|
197
|
+
<modus-icon name="filter-list" size="md" [decorative]="true" />
|
|
198
|
+
<modus-select placeholder="Sort by" [options]="sortOptions" />
|
|
199
|
+
</div>
|
|
200
|
+
<modus-button color="primary" icon="plus" iconPosition="left">New</modus-button>
|
|
201
|
+
</div>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
# AI Guidelines
|
|
207
|
+
|
|
208
|
+
## 7 AI Output Contract
|
|
209
|
+
|
|
210
|
+
- Use `<modus-icon size="sm|md|lg">`, never numeric.
|
|
211
|
+
- Use `[decorative]` and `ariaLabel` correctly in Angular templates.
|
|
212
|
+
- Accept either `<modus-icon>` or `<i class="modus-icons">` per context.
|
|
213
|
+
- All Tailwind utilities must use semantic tokens from `src/styles.css`.
|
|
214
|
+
- Use custom border utilities (`.border-default`, `.border-primary`, etc.) for Tailwind v4 compatibility.
|
|
215
|
+
- Use opacity utilities (`.text-foreground-80`, `.bg-primary-20`, etc.) instead of arbitrary values.
|
|
216
|
+
- Accessibility attributes required for all interactive elements.
|
|
217
|
+
- All motion ≤250ms; respect `prefers-reduced-motion`.
|
|
218
|
+
- Use Tailwind classes (`mr-2`, `ml-2`) instead of inline styles (`[style.margin-right.px]`).
|
|
219
|
+
|
|
220
|
+
## 8 PR / QA Checklist
|
|
221
|
+
|
|
222
|
+
- [ ] All UI uses `<modus-*>` Angular components.
|
|
223
|
+
- [ ] Tailwind tokens match design system in `src/styles.css`.
|
|
224
|
+
- [ ] Custom border utilities used for borders (`.border-default`, `.border-primary`, etc.).
|
|
225
|
+
- [ ] Opacity utilities used for transparency (`.text-foreground-80`, `.bg-primary-20`, etc.).
|
|
226
|
+
- [ ] No inline styles except for truly dynamic values.
|
|
227
|
+
- [ ] ARIA, labels, keyboard, and focus verified.
|
|
228
|
+
- [ ] Empty/loading/error states present.
|
|
229
|
+
- [ ] Only one primary CTA per surface.
|
|
230
|
+
- [ ] Spacing follows 4/8 rhythm (`gap-2`, `gap-4`, `gap-8`).
|
|
231
|
+
- [ ] Colors from design system variables only (`--background`, `--primary`, etc. from `src/styles.css`).
|
|
232
|
+
- [ ] No raw Modus variables (`var(--modus-wc-color-*)`) used directly in templates.
|
|
233
|
+
- [ ] No theme attributes; dark/light handled via root vars.
|
|
234
|
+
|
|
235
|
+
---
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: run-lint-checks
|
|
3
|
+
description: Run comprehensive lint checks for Angular + Vite project to ensure design system compliance, type safety, and code quality. Use when making code changes, before completing tasks, or when the user requests lint checks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Run Lint Checks
|
|
7
|
+
|
|
8
|
+
Automatically run all linting and quality checks for the Angular + Vite project to ensure design system compliance, type safety, and code quality.
|
|
9
|
+
|
|
10
|
+
## When to Use
|
|
11
|
+
|
|
12
|
+
- **Before completing any task** - Always run lint checks before marking tasks as complete
|
|
13
|
+
- **After making code changes** - Run checks after modifying TypeScript, HTML, CSS, or SCSS files
|
|
14
|
+
- **Before committing code** - Ensure all quality gates pass before committing
|
|
15
|
+
- **When user requests** - Run checks when explicitly requested by the user
|
|
16
|
+
- **During code review** - Verify code quality and design system compliance
|
|
17
|
+
|
|
18
|
+
## Instructions
|
|
19
|
+
|
|
20
|
+
### Mandatory Pre-Completion Checklist
|
|
21
|
+
|
|
22
|
+
**CRITICAL**: Before marking any development task as complete, you MUST:
|
|
23
|
+
|
|
24
|
+
1. Run all lint checks using `npm run lint:all`
|
|
25
|
+
2. Fix any violations found
|
|
26
|
+
3. Verify TypeScript type checking passes
|
|
27
|
+
4. Ensure all design system compliance checks pass
|
|
28
|
+
|
|
29
|
+
### Running Lint Checks
|
|
30
|
+
|
|
31
|
+
Execute the comprehensive lint check command:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm run lint:all
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
This command runs all checks in sequence:
|
|
38
|
+
- TypeScript type checking (`npm run type-check`)
|
|
39
|
+
- Color compliance (`npm run lint:colors`)
|
|
40
|
+
- Inline styles validation (`npm run lint:styles`)
|
|
41
|
+
- Border violations (`npm run lint:borders`)
|
|
42
|
+
- Opacity utilities (`npm run lint:opacity`)
|
|
43
|
+
- Icon usage (`npm run lint:icons`)
|
|
44
|
+
- Icon name validation (`npm run lint:icon-names`)
|
|
45
|
+
|
|
46
|
+
### Individual Lint Commands
|
|
47
|
+
|
|
48
|
+
If you need to run checks individually:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# TypeScript type checking
|
|
52
|
+
npm run type-check
|
|
53
|
+
|
|
54
|
+
# Design system color compliance
|
|
55
|
+
npm run lint:colors
|
|
56
|
+
|
|
57
|
+
# Inline styles validation
|
|
58
|
+
npm run lint:styles
|
|
59
|
+
|
|
60
|
+
# Border pattern violations
|
|
61
|
+
npm run lint:borders
|
|
62
|
+
|
|
63
|
+
# Opacity utilities validation
|
|
64
|
+
npm run lint:opacity
|
|
65
|
+
|
|
66
|
+
# Modus icons library validation
|
|
67
|
+
npm run lint:icons
|
|
68
|
+
|
|
69
|
+
# Icon name validation
|
|
70
|
+
npm run lint:icon-names
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Handling Violations
|
|
74
|
+
|
|
75
|
+
When violations are found:
|
|
76
|
+
|
|
77
|
+
1. **Read the error messages carefully** - Each lint script provides specific file locations and violation details
|
|
78
|
+
2. **Fix violations immediately** - Don't proceed until all violations are resolved
|
|
79
|
+
3. **Re-run checks** - After fixing, run `npm run lint:all` again to verify
|
|
80
|
+
4. **Document fixes** - If a fix requires architectural changes, explain the reasoning
|
|
81
|
+
|
|
82
|
+
### Common Violations to Fix
|
|
83
|
+
|
|
84
|
+
#### Inline Styles
|
|
85
|
+
```typescript
|
|
86
|
+
// ❌ VIOLATION
|
|
87
|
+
template: `<div style="background-color: var(--modus-wc-color-base-page)">`
|
|
88
|
+
template: `<div [style.margin-right.px]="8">`
|
|
89
|
+
|
|
90
|
+
// ✅ CORRECT
|
|
91
|
+
template: `<div class="bg-background mr-2 text-foreground">`
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### Color Usage
|
|
95
|
+
```typescript
|
|
96
|
+
// ❌ VIOLATION
|
|
97
|
+
template: `<div style="background-color: #ffffff">`
|
|
98
|
+
template: `<div class="bg-blue-500 text-red-400">`
|
|
99
|
+
|
|
100
|
+
// ✅ CORRECT
|
|
101
|
+
template: `<div class="bg-background text-foreground">`
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
#### Icon Usage
|
|
105
|
+
```typescript
|
|
106
|
+
// ❌ VIOLATION
|
|
107
|
+
template: `<i class="fa fa-home"></i>`
|
|
108
|
+
template: `<mat-icon>home</mat-icon>`
|
|
109
|
+
|
|
110
|
+
// ✅ CORRECT
|
|
111
|
+
template: `<i class="modus-icons">home</i>`
|
|
112
|
+
template: `<modus-icon name="home" />`
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### Border Violations
|
|
116
|
+
```html
|
|
117
|
+
<!-- ❌ VIOLATION -->
|
|
118
|
+
<div class="border border-red-500">Error message</div>
|
|
119
|
+
|
|
120
|
+
<!-- ✅ CORRECT -->
|
|
121
|
+
<div class="border-destructive">Error message</div>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### Opacity Violations
|
|
125
|
+
```html
|
|
126
|
+
<!-- ❌ VIOLATION -->
|
|
127
|
+
<div class="text-foreground/80">Text with opacity</div>
|
|
128
|
+
|
|
129
|
+
<!-- ✅ CORRECT -->
|
|
130
|
+
<div class="text-foreground-80">Text with opacity</div>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Quality Gates
|
|
134
|
+
|
|
135
|
+
All of these must pass before code is considered complete:
|
|
136
|
+
|
|
137
|
+
- [ ] `npm run type-check` - 0 TypeScript errors
|
|
138
|
+
- [ ] `npm run lint:colors` - 0 color violations
|
|
139
|
+
- [ ] `npm run lint:styles` - 0 inline style violations
|
|
140
|
+
- [ ] `npm run lint:borders` - 0 border violations
|
|
141
|
+
- [ ] `npm run lint:opacity` - 0 opacity violations
|
|
142
|
+
- [ ] `npm run lint:icons` - 0 icon violations
|
|
143
|
+
- [ ] `npm run lint:icon-names` - 0 invalid icon names
|
|
144
|
+
|
|
145
|
+
## Integration with Development Workflow
|
|
146
|
+
|
|
147
|
+
This skill integrates with the project's development workflow:
|
|
148
|
+
|
|
149
|
+
1. **During Development**: Run checks periodically to catch issues early
|
|
150
|
+
2. **Before Completion**: Always run `npm run lint:all` before marking tasks complete
|
|
151
|
+
3. **Pre-Commit**: All checks must pass before committing code
|
|
152
|
+
4. **CI/CD**: These same checks run in CI/CD pipelines
|
|
153
|
+
|
|
154
|
+
## Error Handling
|
|
155
|
+
|
|
156
|
+
If lint checks fail:
|
|
157
|
+
|
|
158
|
+
1. **Don't skip or ignore violations** - All violations must be fixed
|
|
159
|
+
2. **Provide clear error messages** - Show the user exactly what failed and where
|
|
160
|
+
3. **Suggest fixes** - When possible, provide specific guidance on how to fix violations
|
|
161
|
+
4. **Re-run after fixes** - Always verify fixes by running checks again
|
|
162
|
+
|
|
163
|
+
## Notes
|
|
164
|
+
|
|
165
|
+
- Lint checks are fast and should be run frequently during development
|
|
166
|
+
- Some violations may require architectural changes - discuss these with the user if needed
|
|
167
|
+
- The `lint:all` command stops on first failure - fix issues sequentially
|
|
168
|
+
- All lint scripts are located in `scripts/` directory
|
|
169
|
+
- These checks enforce the Modus Design System compliance requirements
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Editor configuration, see https://editorconfig.org
|
|
2
|
+
root = true
|
|
3
|
+
|
|
4
|
+
[*]
|
|
5
|
+
charset = utf-8
|
|
6
|
+
indent_style = space
|
|
7
|
+
indent_size = 2
|
|
8
|
+
insert_final_newline = true
|
|
9
|
+
trim_trailing_whitespace = true
|
|
10
|
+
|
|
11
|
+
[*.ts]
|
|
12
|
+
quote_type = single
|
|
13
|
+
ij_typescript_use_double_quotes = false
|
|
14
|
+
|
|
15
|
+
[*.md]
|
|
16
|
+
max_line_length = off
|
|
17
|
+
trim_trailing_whitespace = false
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: npm
|
|
4
|
+
directory: '/'
|
|
5
|
+
groups:
|
|
6
|
+
all-dependencies:
|
|
7
|
+
patterns:
|
|
8
|
+
- '*'
|
|
9
|
+
update-types:
|
|
10
|
+
- 'minor'
|
|
11
|
+
- 'patch'
|
|
12
|
+
schedule:
|
|
13
|
+
interval: monthly
|
|
14
|
+
versioning-strategy: increase
|
|
15
|
+
|
|
16
|
+
- package-ecosystem: github-actions
|
|
17
|
+
directory: '/'
|
|
18
|
+
schedule:
|
|
19
|
+
interval: weekly
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
name: Check Accessibility
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
a11y-check:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- name: Checkout code
|
|
12
|
+
uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- name: Use Node.js 20
|
|
15
|
+
uses: actions/setup-node@v4
|
|
16
|
+
with:
|
|
17
|
+
node-version: "20"
|
|
18
|
+
cache: "npm"
|
|
19
|
+
|
|
20
|
+
- name: Install dependencies
|
|
21
|
+
run: npm ci
|
|
22
|
+
|
|
23
|
+
- name: Build Angular application
|
|
24
|
+
run: npm run build
|
|
25
|
+
|
|
26
|
+
- name: Install Puppeteer and axe-core
|
|
27
|
+
run: npm install --save-dev puppeteer axe-core
|
|
28
|
+
|
|
29
|
+
- name: Install http-server
|
|
30
|
+
run: npm install --save-dev http-server
|
|
31
|
+
|
|
32
|
+
- name: Start server and run accessibility tests
|
|
33
|
+
run: |
|
|
34
|
+
# Start http-server in background
|
|
35
|
+
npx http-server dist/angular-vite/browser -p 4200 > /dev/null 2>&1 &
|
|
36
|
+
SERVER_PID=$!
|
|
37
|
+
|
|
38
|
+
# Wait for server to be ready
|
|
39
|
+
sleep 5
|
|
40
|
+
|
|
41
|
+
# Run accessibility tests
|
|
42
|
+
node << EOF
|
|
43
|
+
const puppeteer = require('puppeteer');
|
|
44
|
+
const axeCore = require('axe-core');
|
|
45
|
+
|
|
46
|
+
(async () => {
|
|
47
|
+
try {
|
|
48
|
+
const browser = await puppeteer.launch({ args: ['--no-sandbox'] });
|
|
49
|
+
const page = await browser.newPage();
|
|
50
|
+
|
|
51
|
+
// Helper function to delay (replaces deprecated waitForTimeout)
|
|
52
|
+
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
53
|
+
|
|
54
|
+
// Routes to test for accessibility
|
|
55
|
+
const routes = [
|
|
56
|
+
'/',
|
|
57
|
+
'/theme-demo',
|
|
58
|
+
'/button-demo'
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
let hasViolations = false;
|
|
62
|
+
|
|
63
|
+
// Configure axe-core to disable specific rules
|
|
64
|
+
const axeConfig = {
|
|
65
|
+
runOnly: {
|
|
66
|
+
type: 'tag',
|
|
67
|
+
values: ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22a', 'wcag22aa', 'best-practice']
|
|
68
|
+
},
|
|
69
|
+
rules: {
|
|
70
|
+
'document-title': { enabled: false },
|
|
71
|
+
'html-has-lang': { enabled: false },
|
|
72
|
+
'landmark-one-main': { enabled: false },
|
|
73
|
+
'page-has-heading-one': { enabled: false },
|
|
74
|
+
'region': { enabled: false }
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
for (const route of routes) {
|
|
79
|
+
const url = \`http://localhost:4200\${route}\`;
|
|
80
|
+
console.log(\`Checking accessibility for: \${url}\`);
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
await page.goto(url, { waitUntil: 'networkidle0', timeout: 30000 });
|
|
84
|
+
|
|
85
|
+
// Wait for Angular to render
|
|
86
|
+
await delay(1000);
|
|
87
|
+
|
|
88
|
+
await page.evaluate(axeCore.source);
|
|
89
|
+
const results = await page.evaluate((config) => {
|
|
90
|
+
return axe.run(document, config);
|
|
91
|
+
}, axeConfig);
|
|
92
|
+
|
|
93
|
+
if (results.violations.length > 0) {
|
|
94
|
+
console.error(\`❌ Accessibility violations found in \${route}:\`);
|
|
95
|
+
results.violations.forEach(violation => {
|
|
96
|
+
console.error(\` - \${violation.id}: \${violation.description}\`);
|
|
97
|
+
if (violation.nodes.length > 0) {
|
|
98
|
+
violation.nodes.forEach(node => {
|
|
99
|
+
console.error(\` * \${node.html}\`);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
hasViolations = true;
|
|
104
|
+
} else {
|
|
105
|
+
console.log(\`✅ No violations found in \${route}\`);
|
|
106
|
+
}
|
|
107
|
+
} catch (error) {
|
|
108
|
+
console.error(\`❌ Error checking \${route}: \${error.message}\`);
|
|
109
|
+
hasViolations = true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
await browser.close();
|
|
114
|
+
|
|
115
|
+
if (hasViolations) {
|
|
116
|
+
console.error('❌ Accessibility tests failed. Please fix the issues before merging.');
|
|
117
|
+
process.exit(1);
|
|
118
|
+
} else {
|
|
119
|
+
console.log('✅ All accessibility tests passed!');
|
|
120
|
+
}
|
|
121
|
+
} catch (error) {
|
|
122
|
+
console.error('❌ An error occurred:', error);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
})();
|
|
126
|
+
EOF
|
|
127
|
+
|
|
128
|
+
# Cleanup: Kill the server
|
|
129
|
+
kill $SERVER_PID 2>/dev/null || true
|
|
130
|
+
|
|
131
|
+
- name: Check test results
|
|
132
|
+
if: failure()
|
|
133
|
+
run: |
|
|
134
|
+
echo "❌ Accessibility tests failed. Please fix the issues before merging."
|
|
135
|
+
exit 1
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build-and-test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- name: Checkout repository
|
|
15
|
+
uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Use Node.js 20
|
|
18
|
+
uses: actions/setup-node@v4
|
|
19
|
+
with:
|
|
20
|
+
node-version: "20"
|
|
21
|
+
cache: "npm"
|
|
22
|
+
|
|
23
|
+
- name: Install dependencies
|
|
24
|
+
run: npm ci
|
|
25
|
+
# Note: .npmrc contains legacy-peer-deps=true to handle Angular 20.x + Modus compatibility
|
|
26
|
+
|
|
27
|
+
- name: Run type checks
|
|
28
|
+
run: npm run type-check
|
|
29
|
+
|
|
30
|
+
- name: Run Modus linting suite
|
|
31
|
+
run: |
|
|
32
|
+
npm run lint:colors
|
|
33
|
+
npm run lint:styles
|
|
34
|
+
npm run lint:borders
|
|
35
|
+
npm run lint:opacity
|
|
36
|
+
npm run lint:icons
|
|
37
|
+
npm run lint:icon-names
|
|
38
|
+
|
|
39
|
+
- name: Build application
|
|
40
|
+
run: npm run build
|
|
41
|
+
|
|
42
|
+
- name: Run tests (if available)
|
|
43
|
+
run: npm run test -- --watch=false --browsers=ChromeHeadless
|
|
44
|
+
continue-on-error: true
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Run all linting checks before commit
|
|
2
|
+
echo "🔍 Running pre-commit checks..."
|
|
3
|
+
|
|
4
|
+
# TypeScript type checking
|
|
5
|
+
echo "📝 Checking TypeScript types..."
|
|
6
|
+
npm run type-check
|
|
7
|
+
|
|
8
|
+
# Design system colors compliance
|
|
9
|
+
echo "🎨 Checking design system colors..."
|
|
10
|
+
npm run lint:colors
|
|
11
|
+
|
|
12
|
+
# Inline styles compliance
|
|
13
|
+
echo "💅 Checking inline styles..."
|
|
14
|
+
npm run lint:styles
|
|
15
|
+
|
|
16
|
+
# Border violations compliance
|
|
17
|
+
echo "🔲 Checking border patterns..."
|
|
18
|
+
npm run lint:borders
|
|
19
|
+
|
|
20
|
+
# Opacity utilities compliance
|
|
21
|
+
echo "🌈 Checking opacity utilities..."
|
|
22
|
+
npm run lint:opacity
|
|
23
|
+
|
|
24
|
+
# Modus Icons compliance
|
|
25
|
+
echo "🎨 Checking Modus Icons usage..."
|
|
26
|
+
npm run lint:icons
|
|
27
|
+
|
|
28
|
+
# Icon names validation
|
|
29
|
+
echo "🏷️ Checking icon names..."
|
|
30
|
+
npm run lint:icon-names
|
|
31
|
+
|
|
32
|
+
echo "✅ All pre-commit checks passed!"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"configurations": [
|
|
5
|
+
{
|
|
6
|
+
"name": "ng serve",
|
|
7
|
+
"type": "chrome",
|
|
8
|
+
"request": "launch",
|
|
9
|
+
"preLaunchTask": "npm: start",
|
|
10
|
+
"url": "http://localhost:4200/"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "ng test",
|
|
14
|
+
"type": "chrome",
|
|
15
|
+
"request": "launch",
|
|
16
|
+
"preLaunchTask": "npm: test",
|
|
17
|
+
"url": "http://localhost:9876/debug.html"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|