@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,509 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Essential integration patterns for Modus Web Components with React + Vite
|
|
3
|
+
globs: ["**/*.tsx", "**/*.ts"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Web Components Integration with React + Vite
|
|
8
|
+
|
|
9
|
+
## 🏗️ **Architecture Overview**
|
|
10
|
+
|
|
11
|
+
**CRITICAL**: This React + Vite application integrates Modus Web Components using the React wrapper package with proper provider setup and event handling patterns.
|
|
12
|
+
|
|
13
|
+
**Integration**: `@trimble-oss/moduswebcomponents-react` v1.0.0-react19 with React 19 compatibility
|
|
14
|
+
|
|
15
|
+
## 📦 **Package Dependencies**
|
|
16
|
+
|
|
17
|
+
### ✅ **Required Dependencies**
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@trimble-oss/moduswebcomponents-react": "^1.0.0-react19",
|
|
23
|
+
"@trimble-oss/modus-icons": "^1.18.0",
|
|
24
|
+
"react": "^19.1.1",
|
|
25
|
+
"react-dom": "^19.1.1",
|
|
26
|
+
"react-router-dom": "^7.9.4",
|
|
27
|
+
"tailwindcss": "^3.4.18"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### ✅ **CSS Import Order**
|
|
33
|
+
|
|
34
|
+
```css
|
|
35
|
+
/* ✅ CORRECT: CSS import order in src/index.css */
|
|
36
|
+
@import url("https://cdn.jsdelivr.net/npm/@trimble-oss/modus-icons@1.17.0/dist/field-systems/fonts/modus-icons.css");
|
|
37
|
+
@import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;500;600;700&display=swap");
|
|
38
|
+
@tailwind base;
|
|
39
|
+
@tailwind components;
|
|
40
|
+
@tailwind utilities;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 🎯 **Provider Setup**
|
|
44
|
+
|
|
45
|
+
### ✅ **ModusProvider Integration**
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
// ✅ CORRECT: ModusProvider setup in App.tsx
|
|
49
|
+
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
|
|
50
|
+
import { Suspense } from "react";
|
|
51
|
+
import ModusProvider from "./components/ModusProvider";
|
|
52
|
+
import { ThemeProvider } from "./contexts/ThemeContext";
|
|
53
|
+
|
|
54
|
+
function App() {
|
|
55
|
+
return (
|
|
56
|
+
<ThemeProvider>
|
|
57
|
+
<ModusProvider>
|
|
58
|
+
<Router>
|
|
59
|
+
<div className="min-h-screen flex flex-col">
|
|
60
|
+
<AppHeader />
|
|
61
|
+
<div className="flex-1">
|
|
62
|
+
<Suspense
|
|
63
|
+
fallback={
|
|
64
|
+
<div className="flex items-center justify-center min-h-screen">
|
|
65
|
+
Loading...
|
|
66
|
+
</div>
|
|
67
|
+
}
|
|
68
|
+
>
|
|
69
|
+
<Routes>
|
|
70
|
+
<Route path="/" element={<></>} />
|
|
71
|
+
<Route path="/components" element={<ComponentsDemo />} />
|
|
72
|
+
{/* Dynamic routes */}
|
|
73
|
+
</Routes>
|
|
74
|
+
</Suspense>
|
|
75
|
+
</div>
|
|
76
|
+
<AppFooter />
|
|
77
|
+
</div>
|
|
78
|
+
</Router>
|
|
79
|
+
</ModusProvider>
|
|
80
|
+
</ThemeProvider>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### ✅ **ModusProvider Component**
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
// ✅ CORRECT: ModusProvider component
|
|
89
|
+
import { ReactNode } from "react";
|
|
90
|
+
|
|
91
|
+
interface ModusProviderProps {
|
|
92
|
+
children: ReactNode;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export default function ModusProvider({ children }: ModusProviderProps) {
|
|
96
|
+
return <>{children}</>;
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 🎨 **Component Integration Patterns**
|
|
101
|
+
|
|
102
|
+
### ✅ **Basic Component Usage**
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
// ✅ CORRECT: Basic Modus component usage
|
|
106
|
+
import {
|
|
107
|
+
ModusWcButton,
|
|
108
|
+
ModusWcTextInput,
|
|
109
|
+
ModusWcCard,
|
|
110
|
+
} from "@trimble-oss/moduswebcomponents-react";
|
|
111
|
+
|
|
112
|
+
function BasicComponents() {
|
|
113
|
+
return (
|
|
114
|
+
<div className="space-y-4">
|
|
115
|
+
<ModusWcButton className="bg-primary text-primary-foreground">
|
|
116
|
+
Click me
|
|
117
|
+
</ModusWcButton>
|
|
118
|
+
|
|
119
|
+
<ModusWcTextInput
|
|
120
|
+
placeholder="Enter text"
|
|
121
|
+
className="w-full border border-input rounded"
|
|
122
|
+
/>
|
|
123
|
+
|
|
124
|
+
<ModusWcCard className="p-4">
|
|
125
|
+
<div slot="header">Card Header</div>
|
|
126
|
+
<div>Card content</div>
|
|
127
|
+
</ModusWcCard>
|
|
128
|
+
</div>
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### ✅ **Event Handling Patterns**
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
// ✅ CORRECT: Event handling with refs
|
|
137
|
+
import { useRef, useEffect } from "react";
|
|
138
|
+
import {
|
|
139
|
+
ModusWcButton,
|
|
140
|
+
ModusWcTextInput,
|
|
141
|
+
} from "@trimble-oss/moduswebcomponents-react";
|
|
142
|
+
|
|
143
|
+
function EventHandlingComponent() {
|
|
144
|
+
const buttonRef = useRef<ModusWcButton>(null);
|
|
145
|
+
const inputRef = useRef<ModusWcTextInput>(null);
|
|
146
|
+
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
const button = buttonRef.current;
|
|
149
|
+
const input = inputRef.current;
|
|
150
|
+
|
|
151
|
+
if (!button || !input) return;
|
|
152
|
+
|
|
153
|
+
const handleButtonClick = (event: CustomEvent) => {
|
|
154
|
+
console.log("Button clicked:", event.detail);
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const handleInputChange = (event: CustomEvent) => {
|
|
158
|
+
console.log("Input changed:", event.detail);
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
button.addEventListener("buttonClick", handleButtonClick);
|
|
162
|
+
input.addEventListener("inputChange", handleInputChange);
|
|
163
|
+
|
|
164
|
+
return () => {
|
|
165
|
+
button.removeEventListener("buttonClick", handleButtonClick);
|
|
166
|
+
input.removeEventListener("inputChange", handleInputChange);
|
|
167
|
+
};
|
|
168
|
+
}, []);
|
|
169
|
+
|
|
170
|
+
return (
|
|
171
|
+
<div className="space-y-4">
|
|
172
|
+
<ModusWcButton ref={buttonRef}>Click me</ModusWcButton>
|
|
173
|
+
|
|
174
|
+
<ModusWcTextInput
|
|
175
|
+
ref={inputRef}
|
|
176
|
+
placeholder="Type something"
|
|
177
|
+
className="w-full"
|
|
178
|
+
/>
|
|
179
|
+
</div>
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### ✅ **State Management Integration**
|
|
185
|
+
|
|
186
|
+
```tsx
|
|
187
|
+
// ✅ CORRECT: State management with Modus components
|
|
188
|
+
import { useState, useRef, useEffect } from "react";
|
|
189
|
+
import {
|
|
190
|
+
ModusWcModal,
|
|
191
|
+
ModusWcButton,
|
|
192
|
+
} from "@trimble-oss/moduswebcomponents-react";
|
|
193
|
+
|
|
194
|
+
function StatefulComponent() {
|
|
195
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
196
|
+
const modalRef = useRef<ModusWcModal>(null);
|
|
197
|
+
|
|
198
|
+
const openModal = () => {
|
|
199
|
+
if (modalRef.current) {
|
|
200
|
+
const dialog = modalRef.current.querySelector(
|
|
201
|
+
"dialog"
|
|
202
|
+
) as HTMLDialogElement;
|
|
203
|
+
if (dialog) {
|
|
204
|
+
dialog.showModal();
|
|
205
|
+
setIsModalOpen(true);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const closeModal = () => {
|
|
211
|
+
if (modalRef.current) {
|
|
212
|
+
const dialog = modalRef.current.querySelector(
|
|
213
|
+
"dialog"
|
|
214
|
+
) as HTMLDialogElement;
|
|
215
|
+
if (dialog) {
|
|
216
|
+
dialog.close();
|
|
217
|
+
setIsModalOpen(false);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
return (
|
|
223
|
+
<div>
|
|
224
|
+
<ModusWcButton onClick={openModal}>Open Modal</ModusWcButton>
|
|
225
|
+
|
|
226
|
+
<ModusWcModal ref={modalRef}>
|
|
227
|
+
<div slot="header">Modal Title</div>
|
|
228
|
+
<div slot="body">Modal content</div>
|
|
229
|
+
<div slot="footer">
|
|
230
|
+
<ModusWcButton onClick={closeModal}>Close</ModusWcButton>
|
|
231
|
+
</div>
|
|
232
|
+
</ModusWcModal>
|
|
233
|
+
</div>
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## 🎨 **Styling Integration**
|
|
239
|
+
|
|
240
|
+
### ✅ **Design System Integration**
|
|
241
|
+
|
|
242
|
+
```tsx
|
|
243
|
+
// ✅ CORRECT: Design system integration
|
|
244
|
+
import {
|
|
245
|
+
ModusWcButton,
|
|
246
|
+
ModusWcCard,
|
|
247
|
+
} from "@trimble-oss/moduswebcomponents-react";
|
|
248
|
+
|
|
249
|
+
function StyledComponents() {
|
|
250
|
+
return (
|
|
251
|
+
<div className="space-y-4">
|
|
252
|
+
<ModusWcButton
|
|
253
|
+
className="
|
|
254
|
+
bg-primary text-primary-foreground
|
|
255
|
+
hover:bg-primary/90
|
|
256
|
+
focus:ring-2 focus:ring-ring
|
|
257
|
+
transition-colors
|
|
258
|
+
px-4 py-2 rounded
|
|
259
|
+
"
|
|
260
|
+
>
|
|
261
|
+
Primary Button
|
|
262
|
+
</ModusWcButton>
|
|
263
|
+
|
|
264
|
+
<ModusWcCard
|
|
265
|
+
className="
|
|
266
|
+
bg-card text-card-foreground
|
|
267
|
+
border border-border
|
|
268
|
+
rounded-lg p-4
|
|
269
|
+
"
|
|
270
|
+
>
|
|
271
|
+
<div slot="header">Card Header</div>
|
|
272
|
+
<div>Card content</div>
|
|
273
|
+
</ModusWcCard>
|
|
274
|
+
</div>
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### ✅ **Theme Integration**
|
|
280
|
+
|
|
281
|
+
```tsx
|
|
282
|
+
// ✅ CORRECT: Theme integration with Modus components
|
|
283
|
+
import { useTheme } from "../hooks/useTheme";
|
|
284
|
+
import { ModusWcButton } from "@trimble-oss/moduswebcomponents-react";
|
|
285
|
+
|
|
286
|
+
function ThemedComponent() {
|
|
287
|
+
const { theme, isDark } = useTheme();
|
|
288
|
+
|
|
289
|
+
return (
|
|
290
|
+
<div className="bg-background text-foreground p-4">
|
|
291
|
+
<div className="text-lg font-semibold mb-4">Current theme: {theme}</div>
|
|
292
|
+
|
|
293
|
+
<ModusWcButton
|
|
294
|
+
className={`
|
|
295
|
+
${
|
|
296
|
+
isDark
|
|
297
|
+
? "bg-primary text-primary-foreground"
|
|
298
|
+
: "bg-secondary text-secondary-foreground"
|
|
299
|
+
}
|
|
300
|
+
hover:opacity-90
|
|
301
|
+
transition-opacity
|
|
302
|
+
px-4 py-2 rounded
|
|
303
|
+
`}
|
|
304
|
+
>
|
|
305
|
+
Themed Button
|
|
306
|
+
</ModusWcButton>
|
|
307
|
+
</div>
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## 🚀 **Vite-Specific Integration**
|
|
313
|
+
|
|
314
|
+
### ✅ **Environment Variables**
|
|
315
|
+
|
|
316
|
+
```tsx
|
|
317
|
+
// ✅ CORRECT: Environment variables in Vite
|
|
318
|
+
import { ModusWcButton } from "@trimble-oss/moduswebcomponents-react";
|
|
319
|
+
|
|
320
|
+
function EnvironmentComponent() {
|
|
321
|
+
const apiUrl = import.meta.env.VITE_API_URL;
|
|
322
|
+
const isDevelopment = import.meta.env.DEV;
|
|
323
|
+
|
|
324
|
+
return (
|
|
325
|
+
<div className="bg-background text-foreground p-4">
|
|
326
|
+
<div className="text-sm text-muted-foreground mb-2">
|
|
327
|
+
API URL: {apiUrl}
|
|
328
|
+
</div>
|
|
329
|
+
<div className="text-sm text-muted-foreground mb-4">
|
|
330
|
+
Environment: {isDevelopment ? "Development" : "Production"}
|
|
331
|
+
</div>
|
|
332
|
+
|
|
333
|
+
<ModusWcButton className="bg-primary text-primary-foreground px-4 py-2 rounded">
|
|
334
|
+
Environment Button
|
|
335
|
+
</ModusWcButton>
|
|
336
|
+
</div>
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### ✅ **Dynamic Imports**
|
|
342
|
+
|
|
343
|
+
```tsx
|
|
344
|
+
// ✅ CORRECT: Dynamic imports with Modus components
|
|
345
|
+
import { lazy, Suspense } from "react";
|
|
346
|
+
import { ModusWcButton } from "@trimble-oss/moduswebcomponents-react";
|
|
347
|
+
|
|
348
|
+
const LazyComponent = lazy(() => import("./LazyComponent"));
|
|
349
|
+
|
|
350
|
+
function DynamicImportComponent() {
|
|
351
|
+
return (
|
|
352
|
+
<div className="space-y-4">
|
|
353
|
+
<ModusWcButton className="bg-primary text-primary-foreground px-4 py-2 rounded">
|
|
354
|
+
Load Lazy Component
|
|
355
|
+
</ModusWcButton>
|
|
356
|
+
|
|
357
|
+
<Suspense
|
|
358
|
+
fallback={
|
|
359
|
+
<div className="flex items-center justify-center p-4">
|
|
360
|
+
<div className="text-foreground">Loading...</div>
|
|
361
|
+
</div>
|
|
362
|
+
}
|
|
363
|
+
>
|
|
364
|
+
<LazyComponent />
|
|
365
|
+
</Suspense>
|
|
366
|
+
</div>
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## 🔧 **TypeScript Integration**
|
|
372
|
+
|
|
373
|
+
### ✅ **TypeScript Configuration**
|
|
374
|
+
|
|
375
|
+
```json
|
|
376
|
+
// ✅ CORRECT: TypeScript configuration
|
|
377
|
+
{
|
|
378
|
+
"compilerOptions": {
|
|
379
|
+
"target": "ES2020",
|
|
380
|
+
"useDefineForClassFields": true,
|
|
381
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
382
|
+
"module": "ESNext",
|
|
383
|
+
"skipLibCheck": true,
|
|
384
|
+
"moduleResolution": "bundler",
|
|
385
|
+
"allowImportingTsExtensions": true,
|
|
386
|
+
"resolveJsonModule": true,
|
|
387
|
+
"isolatedModules": true,
|
|
388
|
+
"noEmit": true,
|
|
389
|
+
"jsx": "react-jsx",
|
|
390
|
+
"strict": true,
|
|
391
|
+
"noUnusedLocals": true,
|
|
392
|
+
"noUnusedParameters": true,
|
|
393
|
+
"noFallthroughCasesInSwitch": true
|
|
394
|
+
},
|
|
395
|
+
"include": ["src"]
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### ✅ **Component Type Definitions**
|
|
400
|
+
|
|
401
|
+
```tsx
|
|
402
|
+
// ✅ CORRECT: Component type definitions
|
|
403
|
+
import {
|
|
404
|
+
ModusWcButton,
|
|
405
|
+
ModusWcTextInput,
|
|
406
|
+
ModusWcCard,
|
|
407
|
+
} from "@trimble-oss/moduswebcomponents-react";
|
|
408
|
+
|
|
409
|
+
interface ComponentProps {
|
|
410
|
+
title: string;
|
|
411
|
+
description?: string;
|
|
412
|
+
onAction?: () => void;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
function TypedComponent({ title, description, onAction }: ComponentProps) {
|
|
416
|
+
return (
|
|
417
|
+
<div className="space-y-4">
|
|
418
|
+
<ModusWcCard className="bg-card text-card-foreground border border-border rounded-lg p-4">
|
|
419
|
+
<div slot="header" className="text-lg font-semibold">
|
|
420
|
+
{title}
|
|
421
|
+
</div>
|
|
422
|
+
<div className="text-sm text-muted-foreground">{description}</div>
|
|
423
|
+
</ModusWcCard>
|
|
424
|
+
|
|
425
|
+
{onAction && (
|
|
426
|
+
<ModusWcButton
|
|
427
|
+
onClick={onAction}
|
|
428
|
+
className="bg-primary text-primary-foreground px-4 py-2 rounded"
|
|
429
|
+
>
|
|
430
|
+
Action Button
|
|
431
|
+
</ModusWcButton>
|
|
432
|
+
)}
|
|
433
|
+
</div>
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
## 🚫 **Common Pitfalls**
|
|
439
|
+
|
|
440
|
+
### ❌ **Don't Use Direct Method Access**
|
|
441
|
+
|
|
442
|
+
```tsx
|
|
443
|
+
// ❌ WRONG: Direct method access
|
|
444
|
+
const buttonRef = useRef<ModusWcButton>(null);
|
|
445
|
+
|
|
446
|
+
const handleClick = () => {
|
|
447
|
+
buttonRef.current?.click(); // ❌ This won't work
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
// ✅ CORRECT: Event handling
|
|
451
|
+
const handleClick = (event: CustomEvent) => {
|
|
452
|
+
console.log("Button clicked:", event.detail);
|
|
453
|
+
};
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
### ❌ **Don't Mix Event Handling Patterns**
|
|
457
|
+
|
|
458
|
+
```tsx
|
|
459
|
+
// ❌ WRONG: Mixing event handling patterns
|
|
460
|
+
<ModusWcButton
|
|
461
|
+
onClick={handleClick} // ❌ React event
|
|
462
|
+
onInputChange={handleChange} // ❌ Custom event
|
|
463
|
+
>
|
|
464
|
+
Button
|
|
465
|
+
</ModusWcButton>
|
|
466
|
+
|
|
467
|
+
// ✅ CORRECT: Consistent event handling
|
|
468
|
+
<ModusWcButton ref={buttonRef}>
|
|
469
|
+
Button
|
|
470
|
+
</ModusWcButton>
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### ❌ **Don't Ignore CSS Import Order**
|
|
474
|
+
|
|
475
|
+
```css
|
|
476
|
+
/* ❌ WRONG: Incorrect CSS import order */
|
|
477
|
+
@tailwind base;
|
|
478
|
+
@tailwind components;
|
|
479
|
+
@tailwind utilities;
|
|
480
|
+
@import url("https://cdn.jsdelivr.net/npm/@trimble-oss/modus-icons@1.17.0/dist/field-systems/fonts/modus-icons.css");
|
|
481
|
+
|
|
482
|
+
/* ✅ CORRECT: Proper CSS import order */
|
|
483
|
+
@import url("https://cdn.jsdelivr.net/npm/@trimble-oss/modus-icons@1.17.0/dist/field-systems/fonts/modus-icons.css");
|
|
484
|
+
@tailwind base;
|
|
485
|
+
@tailwind components;
|
|
486
|
+
@tailwind utilities;
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
## 🎯 **Key Takeaways**
|
|
490
|
+
|
|
491
|
+
1. **Provider Setup**: Use ModusProvider and ThemeProvider for proper integration
|
|
492
|
+
2. **Event Handling**: Use refs and event listeners for Modus Web Components
|
|
493
|
+
3. **CSS Import Order**: Import Modus icons before Tailwind CSS
|
|
494
|
+
4. **TypeScript**: Proper type definitions for Modus components
|
|
495
|
+
5. **Vite Patterns**: Use Vite-specific patterns for environment variables and assets
|
|
496
|
+
|
|
497
|
+
## 🔍 **Integration Checklist**
|
|
498
|
+
|
|
499
|
+
- [ ] ✅ **Package Dependencies**: Correct Modus React package version
|
|
500
|
+
- [ ] ✅ **CSS Import Order**: Modus icons imported before Tailwind
|
|
501
|
+
- [ ] ✅ **Provider Setup**: ModusProvider and ThemeProvider configured
|
|
502
|
+
- [ ] ✅ **Event Handling**: Proper event handling with refs and listeners
|
|
503
|
+
- [ ] ✅ **TypeScript**: Proper type definitions for components
|
|
504
|
+
- [ ] ✅ **Vite Integration**: Environment variables and dynamic imports
|
|
505
|
+
- [ ] ✅ **Theme Integration**: Theme-aware components with conditional styling
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
**Remember: This React + Vite application integrates Modus Web Components using the React wrapper package with proper provider setup, event handling patterns, and CSS import order. Always use refs for event handling and ensure proper CSS import order for Modus icons.**
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Critical React key prop patterns for Modus Web Components
|
|
3
|
+
globs: ["**/*.tsx"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus React Key Warnings - Short
|
|
8
|
+
|
|
9
|
+
Critical React key prop patterns for Modus Web Components.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use composite keys for web components** - `${value}-${index}` pattern for uniqueness
|
|
14
|
+
- **Props over slots for icons** - Use `start-icon={icon}` not `<i slot="start-icon">`
|
|
15
|
+
- **Avoid div wrappers** - Let web components render directly
|
|
16
|
+
- **Never use array index as key** - Use stable identifiers when items can reorder
|
|
17
|
+
- **Handle dynamic content safely** - Use stable identifiers for keys
|
|
18
|
+
- **Test in Chrome DevTools** - Verify no React warnings in console
|
|
19
|
+
- **Follow Modus patterns** - Use established component patterns
|
|
20
|
+
|
|
21
|
+
## Reference
|
|
22
|
+
|
|
23
|
+
For detailed key patterns, common pitfalls, and advanced React techniques, fetch the full rule: `modus-react-key-warnings`
|