@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,472 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Best practices for Modus Web Components in Angular
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Angular Best Practices
|
|
8
|
+
|
|
9
|
+
## Component Architecture
|
|
10
|
+
|
|
11
|
+
### Single Configurable Component Pattern
|
|
12
|
+
|
|
13
|
+
**CRITICAL**: Create **one configurable component** instead of multiple specific components.
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// CORRECT: Single configurable component
|
|
17
|
+
@Component({
|
|
18
|
+
selector: 'app-button',
|
|
19
|
+
template: `
|
|
20
|
+
<modus-button
|
|
21
|
+
[color]="color()"
|
|
22
|
+
[variant]="variant()"
|
|
23
|
+
[size]="size()"
|
|
24
|
+
[disabled]="disabled()"
|
|
25
|
+
(buttonClick)="buttonClick.emit($event)"
|
|
26
|
+
>
|
|
27
|
+
<ng-content />
|
|
28
|
+
</modus-button>
|
|
29
|
+
`,
|
|
30
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
31
|
+
})
|
|
32
|
+
export class AppButtonComponent {
|
|
33
|
+
readonly color = input<ButtonColor>('primary');
|
|
34
|
+
readonly variant = input<ButtonVariant>('filled');
|
|
35
|
+
readonly size = input<ButtonSize>('md');
|
|
36
|
+
readonly disabled = input<boolean>(false);
|
|
37
|
+
readonly buttonClick = output<MouseEvent | KeyboardEvent>();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// WRONG: Multiple specific components
|
|
41
|
+
@Component({ selector: 'app-primary-button', ... })
|
|
42
|
+
export class PrimaryButtonComponent { /* ... */ }
|
|
43
|
+
|
|
44
|
+
@Component({ selector: 'app-secondary-button', ... })
|
|
45
|
+
export class SecondaryButtonComponent { /* ... */ }
|
|
46
|
+
|
|
47
|
+
@Component({ selector: 'app-danger-button', ... })
|
|
48
|
+
export class DangerButtonComponent { /* ... */ }
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Component Composition Pattern
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// CORRECT: Component composition
|
|
55
|
+
@Component({
|
|
56
|
+
selector: 'app-card',
|
|
57
|
+
template: `
|
|
58
|
+
<div class="bg-card text-foreground border-default rounded-lg" [class]="customClass()">
|
|
59
|
+
<ng-content />
|
|
60
|
+
</div>
|
|
61
|
+
`,
|
|
62
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
63
|
+
})
|
|
64
|
+
export class CardComponent {
|
|
65
|
+
readonly customClass = input<string>('');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@Component({
|
|
69
|
+
selector: 'app-card-header',
|
|
70
|
+
template: `
|
|
71
|
+
<div class="flex flex-col space-y-1.5 p-6" [class]="customClass()">
|
|
72
|
+
<ng-content />
|
|
73
|
+
</div>
|
|
74
|
+
`,
|
|
75
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
76
|
+
})
|
|
77
|
+
export class CardHeaderComponent {
|
|
78
|
+
readonly customClass = input<string>('');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@Component({
|
|
82
|
+
selector: 'app-card-title',
|
|
83
|
+
template: `
|
|
84
|
+
<div class="text-2xl font-semibold leading-none tracking-tight" [class]="customClass()">
|
|
85
|
+
<ng-content />
|
|
86
|
+
</div>
|
|
87
|
+
`,
|
|
88
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
89
|
+
})
|
|
90
|
+
export class CardTitleComponent {
|
|
91
|
+
readonly customClass = input<string>('');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@Component({
|
|
95
|
+
selector: 'app-card-content',
|
|
96
|
+
template: `
|
|
97
|
+
<div class="p-6 pt-0" [class]="customClass()">
|
|
98
|
+
<ng-content />
|
|
99
|
+
</div>
|
|
100
|
+
`,
|
|
101
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
102
|
+
})
|
|
103
|
+
export class CardContentComponent {
|
|
104
|
+
readonly customClass = input<string>('');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Usage
|
|
108
|
+
template: `
|
|
109
|
+
<app-card>
|
|
110
|
+
<app-card-header>
|
|
111
|
+
<app-card-title>Card Title</app-card-title>
|
|
112
|
+
</app-card-header>
|
|
113
|
+
<app-card-content>
|
|
114
|
+
<div>Card content</div>
|
|
115
|
+
</app-card-content>
|
|
116
|
+
</app-card>
|
|
117
|
+
`
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Styling Architecture
|
|
121
|
+
|
|
122
|
+
### Design System Integration
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
// CORRECT: Design system color usage
|
|
126
|
+
@Component({
|
|
127
|
+
template: `
|
|
128
|
+
<div class="bg-background text-foreground">
|
|
129
|
+
<div class="bg-card text-foreground border-default rounded-lg p-4">
|
|
130
|
+
<div class="text-primary">Primary text</div>
|
|
131
|
+
<div class="text-secondary">Secondary text</div>
|
|
132
|
+
<div class="text-foreground-60">Muted text</div>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
`,
|
|
136
|
+
})
|
|
137
|
+
export class ThemedComponent {}
|
|
138
|
+
|
|
139
|
+
// WRONG: Generic Tailwind colors
|
|
140
|
+
template: `<div class="bg-blue-500 text-white border-gray-300">Generic colors</div>`
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Responsive Design Patterns
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// CORRECT: Responsive design with design system
|
|
147
|
+
@Component({
|
|
148
|
+
template: `
|
|
149
|
+
<div class="
|
|
150
|
+
grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4
|
|
151
|
+
p-4 md:p-6 lg:p-8
|
|
152
|
+
bg-background text-foreground
|
|
153
|
+
">
|
|
154
|
+
<div class="bg-card text-foreground border-default rounded-lg p-4">
|
|
155
|
+
<div class="text-lg font-semibold mb-2">Card Title</div>
|
|
156
|
+
<div class="text-sm text-foreground-60">Card description</div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
`,
|
|
160
|
+
})
|
|
161
|
+
export class ResponsiveComponent {}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Interactive States
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// CORRECT: Interactive states with design system
|
|
168
|
+
@Component({
|
|
169
|
+
template: `
|
|
170
|
+
<div class="
|
|
171
|
+
bg-card text-foreground border-default rounded-lg p-4
|
|
172
|
+
hover:bg-card/80 hover:shadow-lg
|
|
173
|
+
focus:ring-2 focus:ring-primary focus:ring-offset-2
|
|
174
|
+
active:bg-card/90
|
|
175
|
+
transition-all duration-200
|
|
176
|
+
cursor-pointer
|
|
177
|
+
">
|
|
178
|
+
Interactive content
|
|
179
|
+
</div>
|
|
180
|
+
`,
|
|
181
|
+
})
|
|
182
|
+
export class InteractiveComponent {}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Modus Web Components Integration
|
|
186
|
+
|
|
187
|
+
### Event Handling Patterns
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
// CORRECT: Event handling with signals
|
|
191
|
+
@Component({
|
|
192
|
+
template: `
|
|
193
|
+
<modus-button
|
|
194
|
+
[color]="color()"
|
|
195
|
+
[disabled]="disabled()"
|
|
196
|
+
(buttonClick)="handleClick($event)"
|
|
197
|
+
>
|
|
198
|
+
Click me
|
|
199
|
+
</modus-button>
|
|
200
|
+
`,
|
|
201
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
202
|
+
})
|
|
203
|
+
export class ModusButtonExampleComponent {
|
|
204
|
+
readonly color = input<ButtonColor>('primary');
|
|
205
|
+
readonly disabled = input<boolean>(false);
|
|
206
|
+
|
|
207
|
+
handleClick(event: MouseEvent | KeyboardEvent): void {
|
|
208
|
+
console.log('Button clicked:', event);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### State Management Patterns
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
// CORRECT: State management with Modus components
|
|
217
|
+
@Component({
|
|
218
|
+
template: `
|
|
219
|
+
<modus-button (buttonClick)="openModal()">Open Modal</modus-button>
|
|
220
|
+
|
|
221
|
+
<modus-modal
|
|
222
|
+
id="example-modal"
|
|
223
|
+
[headline]="'Modal Title'"
|
|
224
|
+
>
|
|
225
|
+
<div slot="content">Modal content</div>
|
|
226
|
+
<div slot="footer">
|
|
227
|
+
<modus-button (buttonClick)="closeModal()">Close</modus-button>
|
|
228
|
+
</div>
|
|
229
|
+
</modus-modal>
|
|
230
|
+
`,
|
|
231
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
232
|
+
})
|
|
233
|
+
export class StatefulComponent {
|
|
234
|
+
openModal(): void {
|
|
235
|
+
const dialog = document.getElementById('example-modal') as HTMLDialogElement | null;
|
|
236
|
+
if (dialog && typeof dialog.showModal === 'function') {
|
|
237
|
+
dialog.showModal();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
closeModal(): void {
|
|
242
|
+
const dialog = document.getElementById('example-modal') as HTMLDialogElement | null;
|
|
243
|
+
if (dialog && typeof dialog.close === 'function') {
|
|
244
|
+
dialog.close();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Angular + Vite Specific Patterns
|
|
251
|
+
|
|
252
|
+
### Environment Variables
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
// CORRECT: Environment variables in Angular
|
|
256
|
+
@Component({
|
|
257
|
+
template: `
|
|
258
|
+
<div>
|
|
259
|
+
<div>Environment: {{ isDevelopment ? 'Development' : 'Production' }}</div>
|
|
260
|
+
</div>
|
|
261
|
+
`,
|
|
262
|
+
})
|
|
263
|
+
export class ApiComponent {
|
|
264
|
+
readonly isDevelopment = !environment.production;
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Lazy Loading
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
// CORRECT: Lazy loading routes
|
|
272
|
+
export const routes: Routes = [
|
|
273
|
+
{
|
|
274
|
+
path: 'demos',
|
|
275
|
+
loadChildren: () => import('./demos/demos.routes').then(m => m.DEMO_ROUTES),
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
path: 'settings',
|
|
279
|
+
loadComponent: () => import('./settings/settings.component').then(m => m.SettingsComponent),
|
|
280
|
+
},
|
|
281
|
+
];
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Theme Integration
|
|
285
|
+
|
|
286
|
+
### Theme-Aware Components
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
// CORRECT: Theme-aware component
|
|
290
|
+
@Component({
|
|
291
|
+
template: `
|
|
292
|
+
<div class="
|
|
293
|
+
bg-background text-foreground
|
|
294
|
+
transition-colors duration-200
|
|
295
|
+
">
|
|
296
|
+
<div class="text-foreground">Current theme: {{ currentTheme() }}</div>
|
|
297
|
+
<div class="text-foreground-60">
|
|
298
|
+
Mode: {{ isDarkTheme() ? 'Dark' : 'Light' }}
|
|
299
|
+
</div>
|
|
300
|
+
</div>
|
|
301
|
+
`,
|
|
302
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
303
|
+
})
|
|
304
|
+
export class ThemedComponent {
|
|
305
|
+
private themeService = inject(ThemeService);
|
|
306
|
+
|
|
307
|
+
readonly currentTheme = this.themeService.currentTheme;
|
|
308
|
+
|
|
309
|
+
readonly isDarkTheme = computed(() =>
|
|
310
|
+
this.currentTheme().includes('dark')
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Conditional Theming
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
// CORRECT: Conditional theming
|
|
319
|
+
@Component({
|
|
320
|
+
template: `
|
|
321
|
+
<div class="bg-background text-foreground p-4 rounded border-default">
|
|
322
|
+
<div class="text-lg font-semibold">{{ themeSpecificContent() }}</div>
|
|
323
|
+
</div>
|
|
324
|
+
`,
|
|
325
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
326
|
+
})
|
|
327
|
+
export class ConditionalThemedComponent {
|
|
328
|
+
private themeService = inject(ThemeService);
|
|
329
|
+
readonly currentTheme = this.themeService.currentTheme;
|
|
330
|
+
|
|
331
|
+
readonly themeSpecificContent = computed(() => {
|
|
332
|
+
switch (this.currentTheme()) {
|
|
333
|
+
case 'modus-classic-light':
|
|
334
|
+
return 'Classic Light Theme';
|
|
335
|
+
case 'modus-classic-dark':
|
|
336
|
+
return 'Classic Dark Theme';
|
|
337
|
+
case 'modus-modern-light':
|
|
338
|
+
return 'Modern Light Theme';
|
|
339
|
+
case 'modus-modern-dark':
|
|
340
|
+
return 'Modern Dark Theme';
|
|
341
|
+
case 'connect-light':
|
|
342
|
+
return 'Connect Light Theme';
|
|
343
|
+
case 'connect-dark':
|
|
344
|
+
return 'Connect Dark Theme';
|
|
345
|
+
default:
|
|
346
|
+
return 'Default Theme';
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
## Performance Optimization
|
|
353
|
+
|
|
354
|
+
### Computed Signals for Derived State
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
// CORRECT: Use computed for derived state
|
|
358
|
+
@Component({
|
|
359
|
+
template: `
|
|
360
|
+
<div class="space-y-2">
|
|
361
|
+
@for (item of processedData(); track item.id) {
|
|
362
|
+
<div class="bg-card text-foreground p-2 rounded">
|
|
363
|
+
{{ item.processed }}
|
|
364
|
+
</div>
|
|
365
|
+
}
|
|
366
|
+
</div>
|
|
367
|
+
`,
|
|
368
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
369
|
+
})
|
|
370
|
+
export class ExpensiveComponent {
|
|
371
|
+
readonly data = input.required<DataItem[]>();
|
|
372
|
+
|
|
373
|
+
readonly processedData = computed(() =>
|
|
374
|
+
this.data().map(item => ({
|
|
375
|
+
...item,
|
|
376
|
+
processed: item.value * 2,
|
|
377
|
+
}))
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Lazy Loading Components
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
// CORRECT: Lazy loading with @defer
|
|
386
|
+
@Component({
|
|
387
|
+
template: `
|
|
388
|
+
<div>
|
|
389
|
+
@defer (on viewport) {
|
|
390
|
+
<heavy-component />
|
|
391
|
+
} @placeholder {
|
|
392
|
+
<modus-skeleton height="200px" />
|
|
393
|
+
} @loading {
|
|
394
|
+
<modus-loader />
|
|
395
|
+
}
|
|
396
|
+
</div>
|
|
397
|
+
`,
|
|
398
|
+
})
|
|
399
|
+
export class LazyLoadingComponent {}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
## Common Anti-Patterns
|
|
403
|
+
|
|
404
|
+
### Don't Create Multiple Specific Components
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
// WRONG: Multiple specific components
|
|
408
|
+
@Component({ selector: 'app-primary-button' })
|
|
409
|
+
export class PrimaryButtonComponent { /* ... */ }
|
|
410
|
+
|
|
411
|
+
@Component({ selector: 'app-secondary-button' })
|
|
412
|
+
export class SecondaryButtonComponent { /* ... */ }
|
|
413
|
+
|
|
414
|
+
// CORRECT: Single configurable component
|
|
415
|
+
@Component({ selector: 'app-button' })
|
|
416
|
+
export class ButtonComponent {
|
|
417
|
+
readonly variant = input<'primary' | 'secondary'>('primary');
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### Don't Use Generic Tailwind Colors
|
|
422
|
+
|
|
423
|
+
```html
|
|
424
|
+
<!-- WRONG: Generic Tailwind colors -->
|
|
425
|
+
<div class="bg-blue-500 text-white border-gray-300">
|
|
426
|
+
Generic colors
|
|
427
|
+
</div>
|
|
428
|
+
|
|
429
|
+
<!-- CORRECT: Design system colors -->
|
|
430
|
+
<div class="bg-primary text-white border-default">
|
|
431
|
+
Design system colors
|
|
432
|
+
</div>
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Don't Mix Color Systems
|
|
436
|
+
|
|
437
|
+
```html
|
|
438
|
+
<!-- WRONG: Mixing color systems -->
|
|
439
|
+
<div class="bg-background text-blue-500 border-red-300">
|
|
440
|
+
Mixed color systems
|
|
441
|
+
</div>
|
|
442
|
+
|
|
443
|
+
<!-- CORRECT: Consistent design system -->
|
|
444
|
+
<div class="bg-background text-foreground border-default">
|
|
445
|
+
Consistent design system
|
|
446
|
+
</div>
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
## Key Takeaways
|
|
450
|
+
|
|
451
|
+
1. **Single Configurable Components**: Create one configurable component instead of multiple specific ones
|
|
452
|
+
2. **Design System Colors**: Always use design system colors, never generic Tailwind colors
|
|
453
|
+
3. **Signal-Based State**: Use signals for reactive state management
|
|
454
|
+
4. **Event Handling**: Use proper event handling patterns with outputs
|
|
455
|
+
5. **Theme Integration**: Use theme context for conditional styling and content
|
|
456
|
+
6. **Performance**: Use computed signals and lazy loading for optimization
|
|
457
|
+
7. **OnPush Change Detection**: Always use `ChangeDetectionStrategy.OnPush`
|
|
458
|
+
|
|
459
|
+
## Best Practices Checklist
|
|
460
|
+
|
|
461
|
+
- [ ] **Single Configurable Components**: One component with variants, not multiple specific components
|
|
462
|
+
- [ ] **Design System Colors**: Using design system colors exclusively
|
|
463
|
+
- [ ] **Signal-Based API**: Using `input()`, `output()`, `signal()`, `computed()`
|
|
464
|
+
- [ ] **OnPush Change Detection**: All components use `ChangeDetectionStrategy.OnPush`
|
|
465
|
+
- [ ] **Theme Integration**: Theme-aware components with conditional styling
|
|
466
|
+
- [ ] **Performance**: Computed signals and lazy loading where appropriate
|
|
467
|
+
- [ ] **Accessibility**: Proper accessibility with ARIA attributes
|
|
468
|
+
- [ ] **Consistency**: Consistent patterns across all components
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
**Remember: This Angular + Vite application follows a single configurable component pattern with design system integration. Always use design system colors, signal-based state management, and OnPush change detection. Never use generic Tailwind colors or create multiple specific components.**
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Essential border usage rules for Modus Design System integration in Angular + Vite
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Border Usage Guidelines - Short
|
|
8
|
+
|
|
9
|
+
Essential border usage rules for Modus Design System integration.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use design system border utilities only** - `border-default`, `border-success`, `border-warning`, `border-destructive`, `border-primary`
|
|
14
|
+
- **Never use Tailwind color classes in borders** - No `border-blue-500`, `border-gray-300`, etc.
|
|
15
|
+
- **Use `border-thick` for emphasis** - For important borders and separators
|
|
16
|
+
- **Use directional borders** - `border-top-default`, `border-bottom-default`, etc.
|
|
17
|
+
- **No inline styles for borders** - Use Tailwind classes exclusively
|
|
18
|
+
|
|
19
|
+
## Correct Patterns
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<!-- CORRECT: Design system utilities -->
|
|
23
|
+
<div class="border-default">Default border</div>
|
|
24
|
+
<div class="border-success">Success border</div>
|
|
25
|
+
<div class="border-warning">Warning border</div>
|
|
26
|
+
<div class="border-destructive">Error border</div>
|
|
27
|
+
<div class="border-primary">Primary border</div>
|
|
28
|
+
|
|
29
|
+
<!-- CORRECT: Thick borders -->
|
|
30
|
+
<div class="border-thick-success">Important success</div>
|
|
31
|
+
|
|
32
|
+
<!-- CORRECT: Directional borders -->
|
|
33
|
+
<div class="border-bottom-default">Bottom border</div>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Forbidden Patterns
|
|
37
|
+
|
|
38
|
+
```html
|
|
39
|
+
<!-- WRONG: Tailwind color classes -->
|
|
40
|
+
<div class="border border-red-500">Error</div>
|
|
41
|
+
|
|
42
|
+
<!-- WRONG: Inline styles -->
|
|
43
|
+
<div [style.border]="'1px solid var(--border)'">Content</div>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Reference
|
|
47
|
+
|
|
48
|
+
For detailed border utilities and patterns, fetch the full rule: `modus-angular-border-usage`
|