@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,160 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Essential opacity utilities for Modus Design System colors in Angular + Vite
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Opacity Utilities - Angular
|
|
8
|
+
|
|
9
|
+
Essential opacity utilities for Modus Design System colors in Angular + Vite.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use custom opacity utilities, not Tailwind /80 syntax** - `text-foreground-80` not `text-foreground/80`
|
|
14
|
+
- **CSS variables don't work with Tailwind opacity modifiers** - Tailwind needs actual color values
|
|
15
|
+
- **Use color-mix() for opacity variants** - Modern CSS function for proper opacity calculation
|
|
16
|
+
- **All utilities defined in styles.css** - No Tailwind config changes needed
|
|
17
|
+
- **Respects theme switching** - Works in all 6 Modus themes
|
|
18
|
+
- **Use semantic color names** - `foreground`, `primary`, `destructive`, etc.
|
|
19
|
+
|
|
20
|
+
## Available Opacity Levels
|
|
21
|
+
|
|
22
|
+
- **80%** - `text-foreground-80`, `bg-primary-80`, `border-destructive-80`
|
|
23
|
+
- **60%** - `text-foreground-60`, `bg-primary-60`, `border-destructive-60`
|
|
24
|
+
- **40%** - `text-foreground-40`, `bg-primary-40`, `border-destructive-40`
|
|
25
|
+
- **20%** - `text-foreground-20`, `bg-primary-20`, `border-destructive-20`
|
|
26
|
+
|
|
27
|
+
## Available Colors
|
|
28
|
+
|
|
29
|
+
- **foreground** - `text-foreground-80`, `bg-foreground-80`, `border-foreground-80`
|
|
30
|
+
- **muted-foreground** - `text-muted-foreground-80`, `bg-muted-foreground-80`
|
|
31
|
+
- **primary** - `text-primary-80`, `bg-primary-80`, `border-primary-80`
|
|
32
|
+
- **secondary** - `text-secondary-80`, `bg-secondary-80`
|
|
33
|
+
- **destructive** - `text-destructive-80`, `bg-destructive-80`, `border-destructive-80`
|
|
34
|
+
- **warning** - `text-warning-80`, `bg-warning-80`, `border-warning-80`
|
|
35
|
+
- **success** - `text-success-80`, `bg-success-80`, `border-success-80`
|
|
36
|
+
|
|
37
|
+
## Usage Examples
|
|
38
|
+
|
|
39
|
+
### Text Opacity
|
|
40
|
+
|
|
41
|
+
```html
|
|
42
|
+
<!-- WRONG: Tailwind syntax doesn't work with CSS variables -->
|
|
43
|
+
<div class="text-foreground/80">Text with 80% opacity</div>
|
|
44
|
+
|
|
45
|
+
<!-- CORRECT: Use custom opacity utilities -->
|
|
46
|
+
<div class="text-foreground-80">Text with 80% opacity</div>
|
|
47
|
+
<div class="text-primary-60">Primary text with 60% opacity</div>
|
|
48
|
+
<div class="text-muted-foreground-40">Muted text with 40% opacity</div>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Background Opacity
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<!-- CORRECT: Background opacity utilities -->
|
|
55
|
+
<div class="bg-primary-80">Primary background with 80% opacity</div>
|
|
56
|
+
<div class="bg-destructive-60">Destructive background with 60% opacity</div>
|
|
57
|
+
<div class="bg-warning-40">Warning background with 40% opacity</div>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Border Opacity
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<!-- CORRECT: Border opacity utilities -->
|
|
64
|
+
<div class="border border-primary-80">Primary border with 80% opacity</div>
|
|
65
|
+
<div class="border border-destructive-60">Destructive border with 60% opacity</div>
|
|
66
|
+
<div class="border border-success-40">Success border with 40% opacity</div>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Combined Usage
|
|
70
|
+
|
|
71
|
+
```html
|
|
72
|
+
<!-- CORRECT: Mix opacity utilities with other classes -->
|
|
73
|
+
<div class="p-4 bg-card border border-primary-40 rounded-lg">
|
|
74
|
+
<div class="text-foreground-80 mb-2">Title with 80% opacity</div>
|
|
75
|
+
<div class="text-muted-foreground-60">Description with 60% opacity</div>
|
|
76
|
+
</div>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Implementation Details
|
|
80
|
+
|
|
81
|
+
### CSS Custom Properties
|
|
82
|
+
|
|
83
|
+
```css
|
|
84
|
+
/* Opacity variants for design system colors */
|
|
85
|
+
--foreground-80: color-mix(in srgb, var(--foreground) 80%, transparent);
|
|
86
|
+
--foreground-60: color-mix(in srgb, var(--foreground) 60%, transparent);
|
|
87
|
+
--foreground-40: color-mix(in srgb, var(--foreground) 40%, transparent);
|
|
88
|
+
--foreground-20: color-mix(in srgb, var(--foreground) 20%, transparent);
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Tailwind Utilities
|
|
92
|
+
|
|
93
|
+
```css
|
|
94
|
+
.text-foreground-80 {
|
|
95
|
+
color: var(--foreground-80);
|
|
96
|
+
}
|
|
97
|
+
.text-foreground-60 {
|
|
98
|
+
color: var(--foreground-60);
|
|
99
|
+
}
|
|
100
|
+
.text-foreground-40 {
|
|
101
|
+
color: var(--foreground-40);
|
|
102
|
+
}
|
|
103
|
+
.text-foreground-20 {
|
|
104
|
+
color: var(--foreground-20);
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Common Patterns
|
|
109
|
+
|
|
110
|
+
### Subtle Text Hierarchy
|
|
111
|
+
|
|
112
|
+
```html
|
|
113
|
+
<div class="space-y-2">
|
|
114
|
+
<div class="text-foreground">Main heading (100%)</div>
|
|
115
|
+
<div class="text-foreground-80">Subheading (80%)</div>
|
|
116
|
+
<div class="text-muted-foreground-60">Description (60%)</div>
|
|
117
|
+
<div class="text-muted-foreground-40">Caption (40%)</div>
|
|
118
|
+
</div>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Interactive States
|
|
122
|
+
|
|
123
|
+
```html
|
|
124
|
+
<modus-button class="bg-primary hover:bg-primary-80 transition-colors">
|
|
125
|
+
Hover with opacity
|
|
126
|
+
</modus-button>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Overlay Effects
|
|
130
|
+
|
|
131
|
+
```html
|
|
132
|
+
<div class="relative">
|
|
133
|
+
<div class="bg-foreground-20 absolute inset-0 rounded-lg"></div>
|
|
134
|
+
<div class="relative z-10 p-4">Content with overlay</div>
|
|
135
|
+
</div>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Migration Guide
|
|
139
|
+
|
|
140
|
+
### From Tailwind /80 syntax
|
|
141
|
+
|
|
142
|
+
```html
|
|
143
|
+
<!-- WRONG: Old (doesn't work with CSS variables) -->
|
|
144
|
+
<div class="text-foreground/80">Text</div>
|
|
145
|
+
<div class="bg-primary/60">Background</div>
|
|
146
|
+
<div class="border-destructive/40">Border</div>
|
|
147
|
+
|
|
148
|
+
<!-- CORRECT: New (works with design system) -->
|
|
149
|
+
<div class="text-foreground-80">Text</div>
|
|
150
|
+
<div class="bg-primary-60">Background</div>
|
|
151
|
+
<div class="border-destructive-40">Border</div>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Best Practices
|
|
155
|
+
|
|
156
|
+
- **Use semantic colors** - `foreground`, `primary`, `destructive` instead of generic colors
|
|
157
|
+
- **Maintain contrast ratios** - Ensure accessibility with opacity levels
|
|
158
|
+
- **Test in all themes** - Verify opacity works in light and dark modes
|
|
159
|
+
- **Use consistent opacity levels** - Stick to 80%, 60%, 40%, 20% for consistency
|
|
160
|
+
- **Combine with other utilities** - Mix with spacing, sizing, and layout classes
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: ModusSelect vs ModusDropdownMenu reliability comparison in Angular
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Select vs Dropdown Menu - Short
|
|
8
|
+
|
|
9
|
+
Use ModusDropdownMenu instead of ModusSelect for reliable event handling.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use ModusDropdownMenu, not ModusSelect** - ModusSelect has unreliable event handling in some scenarios
|
|
14
|
+
- **Reliable itemSelect events** - ModusDropdownMenu provides consistent event handling
|
|
15
|
+
- **Proper state management** - Use Angular signals to track selected values and visibility
|
|
16
|
+
- **Programmatic control** - Use `menuVisible` property for control
|
|
17
|
+
- **Event handling patterns** - Handle `itemSelect` events for selection changes
|
|
18
|
+
|
|
19
|
+
## Correct Pattern
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
@Component({
|
|
23
|
+
template: `
|
|
24
|
+
<modus-dropdown-menu
|
|
25
|
+
[menuVisible]="isOpen()"
|
|
26
|
+
(itemSelect)="handleItemSelect($event)"
|
|
27
|
+
(menuVisibleChange)="isOpen.set($event)"
|
|
28
|
+
>
|
|
29
|
+
<modus-button slot="trigger" (buttonClick)="toggleDropdown()">
|
|
30
|
+
{{ selectedLabel() || 'Select an option' }}
|
|
31
|
+
</modus-button>
|
|
32
|
+
@for (item of menuItems(); track item.value) {
|
|
33
|
+
<modus-menu-item [value]="item.value">{{ item.label }}</modus-menu-item>
|
|
34
|
+
}
|
|
35
|
+
</modus-dropdown-menu>
|
|
36
|
+
`,
|
|
37
|
+
})
|
|
38
|
+
export class DropdownComponent {
|
|
39
|
+
readonly selectedValue = signal<string>('');
|
|
40
|
+
readonly isOpen = signal(false);
|
|
41
|
+
|
|
42
|
+
handleItemSelect(event: CustomEvent<{ value: string }>): void {
|
|
43
|
+
this.selectedValue.set(event.detail.value);
|
|
44
|
+
this.isOpen.set(false);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Reference
|
|
50
|
+
|
|
51
|
+
For detailed component comparison and advanced usage, fetch the full rule: `modus-angular-select-vs-dropdown-menu`
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: ModusSelect vs ModusDropdownMenu reliability comparison in Angular
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# ModusSelect vs ModusDropdownMenu in Angular
|
|
8
|
+
|
|
9
|
+
## CRITICAL: ModusSelect Reliability Issues
|
|
10
|
+
|
|
11
|
+
**Problem**: `ModusSelect` component has unreliable event handling in some scenarios, especially with Chrome DevTools automation and testing.
|
|
12
|
+
|
|
13
|
+
**Solution**: Use `ModusDropdownMenu` with `itemSelect` events, which are more reliable and consistent.
|
|
14
|
+
|
|
15
|
+
## Correct Pattern: Use ModusDropdownMenu
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// CORRECT: ModusDropdownMenu with reliable events
|
|
19
|
+
@Component({
|
|
20
|
+
template: `
|
|
21
|
+
<modus-dropdown-menu
|
|
22
|
+
[menuVisible]="isOpen()"
|
|
23
|
+
(itemSelect)="handleItemSelect($event)"
|
|
24
|
+
(menuVisibleChange)="isOpen.set($event)"
|
|
25
|
+
>
|
|
26
|
+
<modus-button
|
|
27
|
+
slot="trigger"
|
|
28
|
+
variant="outlined"
|
|
29
|
+
(buttonClick)="toggleDropdown()"
|
|
30
|
+
>
|
|
31
|
+
{{ selectedLabel() || 'Select an option' }}
|
|
32
|
+
<i class="modus-icons ml-2">{{ isOpen() ? 'caret_up' : 'caret_down' }}</i>
|
|
33
|
+
</modus-button>
|
|
34
|
+
|
|
35
|
+
@for (item of menuItems(); track item.value) {
|
|
36
|
+
<modus-menu-item
|
|
37
|
+
[value]="item.value"
|
|
38
|
+
[class.bg-primary-20]="selectedValue() === item.value"
|
|
39
|
+
>
|
|
40
|
+
{{ item.label }}
|
|
41
|
+
</modus-menu-item>
|
|
42
|
+
}
|
|
43
|
+
</modus-dropdown-menu>
|
|
44
|
+
`,
|
|
45
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
46
|
+
})
|
|
47
|
+
export class ReliableDropdownComponent {
|
|
48
|
+
readonly selectedValue = signal<string>('');
|
|
49
|
+
readonly isOpen = signal(false);
|
|
50
|
+
|
|
51
|
+
readonly menuItems = signal([
|
|
52
|
+
{ label: 'Option 1', value: 'option1' },
|
|
53
|
+
{ label: 'Option 2', value: 'option2' },
|
|
54
|
+
{ label: 'Option 3', value: 'option3' },
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
readonly selectedLabel = computed(() => {
|
|
58
|
+
const item = this.menuItems().find(i => i.value === this.selectedValue());
|
|
59
|
+
return item?.label ?? '';
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
handleItemSelect(event: CustomEvent<{ value: string }>): void {
|
|
63
|
+
const value = event.detail.value;
|
|
64
|
+
this.selectedValue.set(value);
|
|
65
|
+
this.isOpen.set(false);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
toggleDropdown(): void {
|
|
69
|
+
this.isOpen.update(open => !open);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Key Takeaways
|
|
75
|
+
|
|
76
|
+
1. **Prefer ModusDropdownMenu**: Use `ModusDropdownMenu` for reliable event handling
|
|
77
|
+
2. **Reliable Events**: `itemSelect` events are more reliable than `inputChange` events
|
|
78
|
+
3. **Programmatic Control**: Use `menuVisible` property for programmatic control
|
|
79
|
+
4. **Event Handling**: Use proper event handling patterns with signals
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
**Remember: ModusSelect may have unreliable event handling in some scenarios. Prefer ModusDropdownMenu with itemSelect events for reliable dropdown functionality.**
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Semantic HTML usage guidelines for Angular + Vite with Modus
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Semantic HTML - Short
|
|
8
|
+
|
|
9
|
+
Use div elements exclusively to avoid Tailwind CSS conflicts.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use div elements only** - All content must use `<div>` elements
|
|
14
|
+
- **No semantic HTML elements** - Never use `h1`, `p`, `section`, `header`, `footer`, `nav`, `main`, `aside`, `article`, `span`
|
|
15
|
+
- **Use Tailwind classes for styling** - Apply typography and layout with Tailwind classes
|
|
16
|
+
- **Icon exception** - Only `<i>` elements allowed for Modus icons
|
|
17
|
+
- **Consistent structure** - Maintain consistent div-based component structure
|
|
18
|
+
|
|
19
|
+
## Correct Patterns
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<!-- CORRECT: Div elements with Tailwind classes -->
|
|
23
|
+
<div class="text-4xl font-bold">Title</div>
|
|
24
|
+
<div class="text-base">Paragraph text</div>
|
|
25
|
+
<div class="bg-background">Header content</div>
|
|
26
|
+
<div class="bg-muted">Footer content</div>
|
|
27
|
+
|
|
28
|
+
<!-- WRONG: Semantic HTML elements -->
|
|
29
|
+
<h1 class="text-4xl font-bold">Title</h1>
|
|
30
|
+
<p class="text-base">Paragraph text</p>
|
|
31
|
+
<header class="bg-background">Header content</header>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Reference
|
|
35
|
+
|
|
36
|
+
For detailed HTML patterns and accessibility guidelines, fetch the full rule: `modus-angular-semantic-html`
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Semantic HTML usage guidelines for Angular + Vite with Modus
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Semantic HTML Usage in Angular + Vite
|
|
8
|
+
|
|
9
|
+
## CRITICAL: Use Div Elements Only
|
|
10
|
+
|
|
11
|
+
**MANDATORY**: This Angular + Vite application uses **div elements exclusively** for all content (except `<i>` for icons) to avoid conflicts with Tailwind CSS default browser styles.
|
|
12
|
+
|
|
13
|
+
**Rule**: Use `div` elements with Tailwind classes instead of semantic HTML elements.
|
|
14
|
+
|
|
15
|
+
## FORBIDDEN: Semantic HTML Elements
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<!-- WRONG: Semantic HTML elements -->
|
|
19
|
+
<h1 class="text-4xl font-bold">Title</h1>
|
|
20
|
+
<p class="text-base">Paragraph text</p>
|
|
21
|
+
<section class="mb-8 p-4">Content section</section>
|
|
22
|
+
<header class="bg-background">Header content</header>
|
|
23
|
+
<footer class="bg-muted">Footer content</footer>
|
|
24
|
+
<nav class="flex space-x-4">Navigation</nav>
|
|
25
|
+
<span class="text-sm">Inline text</span>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## CORRECT: Div Elements with Tailwind
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<!-- CORRECT: Div elements with Tailwind classes -->
|
|
32
|
+
<div class="text-4xl font-bold">Title</div>
|
|
33
|
+
<div class="text-base">Paragraph text</div>
|
|
34
|
+
<div class="mb-8 p-4">Content section</div>
|
|
35
|
+
<div class="bg-background">Header content</div>
|
|
36
|
+
<div class="bg-muted">Footer content</div>
|
|
37
|
+
<div class="flex space-x-4">Navigation</div>
|
|
38
|
+
<div class="text-sm">Inline text</div>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Component Patterns
|
|
42
|
+
|
|
43
|
+
### Page Layout with Divs
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
@Component({
|
|
47
|
+
selector: 'page-layout',
|
|
48
|
+
template: `
|
|
49
|
+
<div class="min-h-screen flex flex-col">
|
|
50
|
+
<div class="bg-background border-b border-default">
|
|
51
|
+
<div class="container mx-auto px-4 py-4">
|
|
52
|
+
<div class="text-2xl font-bold text-foreground">App Title</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<div class="flex-1">
|
|
57
|
+
<ng-content />
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div class="bg-muted border-t border-default">
|
|
61
|
+
<div class="container mx-auto px-4 py-4">
|
|
62
|
+
<div class="text-sm text-foreground-60">Footer content</div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
`,
|
|
67
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
68
|
+
})
|
|
69
|
+
export class PageLayoutComponent {}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Semantic HTML Compliance Checklist
|
|
73
|
+
|
|
74
|
+
- [ ] **No Semantic Elements**: No `h1`, `h2`, `p`, `section`, `header`, `footer`, `nav`, `main`, `aside`, `article`, `span`
|
|
75
|
+
- [ ] **Div Elements Only**: All content uses `div` elements
|
|
76
|
+
- [ ] **Icon Exception**: Only `<i>` elements allowed for icons
|
|
77
|
+
- [ ] **Tailwind Styling**: All styling through Tailwind classes
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
**Remember: This Angular + Vite application uses div elements exclusively for all content (except `<i>` for icons) to avoid conflicts with Tailwind CSS default browser styles.**
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Integration patterns for Modus Navbar with Side Navigation in Angular
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Side Navigation Usage - Short
|
|
8
|
+
|
|
9
|
+
Critical integration patterns for Modus Navbar with Side Navigation in Angular.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use Angular wrapper components** - Use `modus-navbar` and `modus-side-navigation`, not raw web components
|
|
14
|
+
- **Pass props as native objects** - Angular handles binding automatically
|
|
15
|
+
- **Listen for mainMenuOpenChange events** - Use DOM event listeners on container
|
|
16
|
+
- **Position side navigation absolutely** - Required for proper layering
|
|
17
|
+
- **Set explicit z-index** - Ensure side navigation renders above content
|
|
18
|
+
- **Account for collapsed width** - Add margin-left to panel content
|
|
19
|
+
|
|
20
|
+
## Required CSS
|
|
21
|
+
|
|
22
|
+
```css
|
|
23
|
+
.side-navigation {
|
|
24
|
+
position: absolute;
|
|
25
|
+
left: 0;
|
|
26
|
+
top: 0;
|
|
27
|
+
height: 100%;
|
|
28
|
+
z-index: 999;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.panel-content {
|
|
32
|
+
margin-left: 4rem;
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Event Integration
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
ngAfterViewInit(): void {
|
|
40
|
+
const container = this.elementRef.nativeElement.querySelector('.layout-with-navbar');
|
|
41
|
+
container.addEventListener('mainMenuOpenChange', (event: any) => {
|
|
42
|
+
const sideNav = container.querySelector('modus-wc-side-navigation');
|
|
43
|
+
if (sideNav) sideNav.expanded = event.detail;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Reference
|
|
49
|
+
|
|
50
|
+
For detailed layout patterns and common pitfalls, fetch the full rule: `modus-angular-side-navigation-usage`
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Integration patterns for Modus Navbar with Side Navigation in Angular
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Navbar + Side Navigation Integration (Angular)
|
|
8
|
+
|
|
9
|
+
Critical patterns for integrating `modus-navbar` with `modus-side-navigation` in Angular applications.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use Angular wrapper components** - Use `modus-navbar` and `modus-side-navigation`, not raw web components
|
|
14
|
+
- **Pass props as native objects** - Angular handles binding automatically
|
|
15
|
+
- **Listen for mainMenuOpenChange events** - Use DOM event listeners on container
|
|
16
|
+
- **Position side navigation absolutely** - Required for proper layering
|
|
17
|
+
- **Set explicit z-index** - Ensure side navigation renders above content
|
|
18
|
+
|
|
19
|
+
## DO: Use Angular Wrapper Components
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<!-- DO: Use Angular wrapper components -->
|
|
23
|
+
<modus-navbar [userCard]="userCardInfo()" [visibility]="{ mainMenu: true, user: true }" />
|
|
24
|
+
|
|
25
|
+
<modus-side-navigation
|
|
26
|
+
[expanded]="false"
|
|
27
|
+
[collapseOnClickOutside]="true"
|
|
28
|
+
[maxWidth]="'256px'"
|
|
29
|
+
mode="push"
|
|
30
|
+
[targetContent]="'#panel-content'"
|
|
31
|
+
/>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## DO: Setup Event Listeners in ngAfterViewInit
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
export class SideNavigationDemoComponent implements AfterViewInit {
|
|
38
|
+
readonly navbarMenuExpanded = signal<boolean>(false);
|
|
39
|
+
|
|
40
|
+
constructor(private elementRef: ElementRef) {}
|
|
41
|
+
|
|
42
|
+
ngAfterViewInit(): void {
|
|
43
|
+
this.setupNavbarSideNavigationIntegration();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private setupNavbarSideNavigationIntegration(): void {
|
|
47
|
+
const container = this.elementRef.nativeElement.querySelector('.layout-with-navbar');
|
|
48
|
+
|
|
49
|
+
container.addEventListener('mainMenuOpenChange', (event: any) => {
|
|
50
|
+
const sideNav = container.querySelector('modus-wc-side-navigation');
|
|
51
|
+
|
|
52
|
+
if (sideNav) {
|
|
53
|
+
sideNav.expanded = event.detail;
|
|
54
|
+
this.navbarMenuExpanded.set(event.detail);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const sideNav = container.querySelector('modus-wc-side-navigation');
|
|
59
|
+
sideNav?.addEventListener('expandedChange', (event: any) => {
|
|
60
|
+
this.navbarMenuExpanded.set(event.detail);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## DO: Position Side Navigation Absolutely with Z-Index
|
|
67
|
+
|
|
68
|
+
```css
|
|
69
|
+
.layout-with-navbar {
|
|
70
|
+
box-shadow: rgba(36, 35, 45, 0.3) 1px 0 4px;
|
|
71
|
+
display: flex;
|
|
72
|
+
flex-direction: column;
|
|
73
|
+
height: 100%;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.layout-with-navbar .main-content-row {
|
|
77
|
+
display: flex;
|
|
78
|
+
flex: 1;
|
|
79
|
+
overflow: hidden;
|
|
80
|
+
position: relative;
|
|
81
|
+
min-height: 500px;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.layout-with-navbar .side-navigation,
|
|
85
|
+
.layout-with-navbar modus-side-navigation {
|
|
86
|
+
position: absolute;
|
|
87
|
+
left: 0;
|
|
88
|
+
top: 0;
|
|
89
|
+
height: 100%;
|
|
90
|
+
z-index: 999;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.layout-with-navbar .panel-content {
|
|
94
|
+
flex: 1;
|
|
95
|
+
padding: 1.5rem;
|
|
96
|
+
overflow: auto;
|
|
97
|
+
margin-left: 4rem;
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Required Layout Structure
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<div class="layout-with-navbar h-[600px] flex flex-col" data-example="basic">
|
|
105
|
+
<modus-navbar [userCard]="userCardInfo()" [visibility]="{ mainMenu: true, user: true }" />
|
|
106
|
+
|
|
107
|
+
<div class="main-content-row flex flex-1 overflow-hidden">
|
|
108
|
+
<modus-side-navigation
|
|
109
|
+
[expanded]="false"
|
|
110
|
+
[collapseOnClickOutside]="true"
|
|
111
|
+
[maxWidth]="'256px'"
|
|
112
|
+
mode="push"
|
|
113
|
+
[targetContent]="'#panel-content'"
|
|
114
|
+
class="side-navigation h-full"
|
|
115
|
+
>
|
|
116
|
+
<modus-menu size="lg">
|
|
117
|
+
<modus-menu-item label="Home" value="home" [selected]="true">
|
|
118
|
+
<modus-icon slot="start-icon" name="home" [decorative]="true"></modus-icon>
|
|
119
|
+
</modus-menu-item>
|
|
120
|
+
</modus-menu>
|
|
121
|
+
</modus-side-navigation>
|
|
122
|
+
|
|
123
|
+
<div id="panel-content" class="panel-content flex-1 p-6">
|
|
124
|
+
<!-- Main content here -->
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Common Pitfalls
|
|
131
|
+
|
|
132
|
+
1. **Hamburger menu not visible** - Ensure `visibility.mainMenu: true` is set on navbar
|
|
133
|
+
2. **Side nav expands then immediately collapses** - Set `expanded` property directly on web component ref
|
|
134
|
+
3. **Side nav hidden by content** - Use `position: absolute` and `z-index: 999` in global CSS
|
|
135
|
+
4. **Events not firing** - Use `addEventListener` on container, not Angular event binding
|
|
136
|
+
5. **State not updating** - Set properties directly on the `modus-wc-side-navigation` element
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Modus Table component usage patterns for Angular
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Table Usage - Short
|
|
8
|
+
|
|
9
|
+
Essential patterns for Modus Table component in Angular.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use custom editors for editable cells** - Set `editor: 'custom'` with `customEditorRenderer`
|
|
14
|
+
- **Use design system CSS variables** - `--border`, `--background`, `--foreground` in editors
|
|
15
|
+
- **Handle keyboard events** - Enter to commit, Escape to cancel
|
|
16
|
+
- **Use immutable updates with signals** - For proper change detection
|
|
17
|
+
- **Import types from Modus** - `ITableColumn` from `@trimble-oss/moduswebcomponents`
|
|
18
|
+
|
|
19
|
+
## Basic Usage
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const columns: ITableColumn[] = [
|
|
23
|
+
{ id: 'name', header: 'Name', accessor: 'name', width: '40%' },
|
|
24
|
+
{ id: 'role', header: 'Role', accessor: 'role' },
|
|
25
|
+
];
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<modus-table
|
|
30
|
+
[columns]="columns"
|
|
31
|
+
[data]="data"
|
|
32
|
+
density="comfortable"
|
|
33
|
+
[zebra]="true"
|
|
34
|
+
[hover]="true"
|
|
35
|
+
/>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Editable Cells
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
{
|
|
42
|
+
id: 'task',
|
|
43
|
+
header: 'Task',
|
|
44
|
+
accessor: 'task',
|
|
45
|
+
editor: 'custom',
|
|
46
|
+
customEditorRenderer: (value, onCommit) => createTextEditor(value, onCommit),
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Reference
|
|
51
|
+
|
|
52
|
+
For detailed table patterns and custom editors, fetch the full rule: `modus-angular-table-usage`
|