@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,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "src/components/**/*.tsx"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Modus Wrapper Component Patterns
|
|
6
|
+
|
|
7
|
+
These are wrapper components that wrap `@trimble-oss/moduswebcomponents-react` web components.
|
|
8
|
+
|
|
9
|
+
## Event Handling Pattern
|
|
10
|
+
|
|
11
|
+
Always use `useRef` + `useEffect` for web component events:
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
const componentRef = useRef<HTMLModusWcButtonElement>(null);
|
|
15
|
+
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
const element = componentRef.current;
|
|
18
|
+
if (!element) return;
|
|
19
|
+
|
|
20
|
+
const handleEvent = (event: Event) => {
|
|
21
|
+
const customEvent = event as CustomEvent<EventDetail>;
|
|
22
|
+
// Handle event
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
element.addEventListener('eventName', handleEvent);
|
|
26
|
+
return () => element.removeEventListener('eventName', handleEvent);
|
|
27
|
+
}, []);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## State Management
|
|
31
|
+
|
|
32
|
+
- Let Modus components manage their own internal state
|
|
33
|
+
- Don't control accordion/modal expanded state from React useState
|
|
34
|
+
- Use refs for programmatic control when needed
|
|
35
|
+
|
|
36
|
+
## Props Pattern
|
|
37
|
+
|
|
38
|
+
Use conditional prop spreading to avoid overriding defaults:
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
<ModusWcButton
|
|
42
|
+
{...(color && { color })}
|
|
43
|
+
{...(variant && { variant })}
|
|
44
|
+
size={size}
|
|
45
|
+
>
|
|
46
|
+
{children}
|
|
47
|
+
</ModusWcButton>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Modal Implementation
|
|
51
|
+
|
|
52
|
+
Use `forwardRef` with `useImperativeHandle`:
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
const ModusModal = forwardRef<ModusModalRef, Props>((props, ref) => {
|
|
56
|
+
const modalRef = useRef<HTMLModusWcModalElement>(null);
|
|
57
|
+
|
|
58
|
+
const openModal = () => {
|
|
59
|
+
const dialog = modalRef.current?.querySelector("dialog");
|
|
60
|
+
dialog?.showModal();
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
useImperativeHandle(ref, () => ({ openModal, closeModal }));
|
|
64
|
+
// ...
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Checkbox Bug
|
|
69
|
+
|
|
70
|
+
The `value` property is inverted. Always invert:
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
const actualChecked = !event.detail.value;
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Select Component
|
|
77
|
+
|
|
78
|
+
Use `ModusDropdownMenu` instead of `ModusSelect` for reliable event handling.
|
|
79
|
+
|
|
80
|
+
## Button Group
|
|
81
|
+
|
|
82
|
+
Don't set default `variant` or `color` on buttons inside groups - let the group control styling.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "src/demos/**/*.tsx"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Demo Page Patterns
|
|
6
|
+
|
|
7
|
+
Demo pages showcase Modus components with interactive examples.
|
|
8
|
+
|
|
9
|
+
## Page Structure
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
export default function ComponentDemo() {
|
|
13
|
+
return (
|
|
14
|
+
<div className="space-y-8 p-6">
|
|
15
|
+
<div className="text-2xl font-bold text-foreground">Component Name</div>
|
|
16
|
+
<div className="text-foreground-60">Description of the component.</div>
|
|
17
|
+
|
|
18
|
+
{/* Demo sections */}
|
|
19
|
+
<DemoSection title="Basic Usage">
|
|
20
|
+
{/* Examples */}
|
|
21
|
+
</DemoSection>
|
|
22
|
+
|
|
23
|
+
<DemoSection title="Variants">
|
|
24
|
+
{/* Variant examples */}
|
|
25
|
+
</DemoSection>
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Demo Section Pattern
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
<div className="space-y-4">
|
|
35
|
+
<div className="text-lg font-semibold text-foreground">Section Title</div>
|
|
36
|
+
<div className="flex flex-wrap gap-4">
|
|
37
|
+
{/* Component examples */}
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Styling Rules
|
|
43
|
+
|
|
44
|
+
- Use design system colors: `bg-background`, `text-foreground`, `bg-card`
|
|
45
|
+
- Use opacity utilities: `text-foreground-60` (not `text-foreground/60`)
|
|
46
|
+
- Use custom border utilities: `border-default`, `border-bottom-default`
|
|
47
|
+
- Use `<div>` elements only (no semantic HTML)
|
|
48
|
+
|
|
49
|
+
## Interactive Examples
|
|
50
|
+
|
|
51
|
+
Show multiple states and variants:
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
<div className="flex flex-wrap gap-4">
|
|
55
|
+
<ModusButton color="primary">Primary</ModusButton>
|
|
56
|
+
<ModusButton color="secondary">Secondary</ModusButton>
|
|
57
|
+
<ModusButton color="danger">Danger</ModusButton>
|
|
58
|
+
</div>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Event Handling Demos
|
|
62
|
+
|
|
63
|
+
Demonstrate event handling with visible feedback:
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
const [lastAction, setLastAction] = useState<string>("");
|
|
67
|
+
|
|
68
|
+
<ModusButton onClick={() => setLastAction("Button clicked")}>
|
|
69
|
+
Click Me
|
|
70
|
+
</ModusButton>
|
|
71
|
+
<div className="text-foreground-60">Last action: {lastAction}</div>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Icons in Demos
|
|
75
|
+
|
|
76
|
+
Use Modus icons only with underscore naming:
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
<i className="modus-icons">check_circle</i>
|
|
80
|
+
<i className="modus-icons">warning</i>
|
|
81
|
+
<i className="modus-icons">info</i>
|
|
82
|
+
```
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "src/pages/**/*.tsx"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Application Page Patterns
|
|
6
|
+
|
|
7
|
+
Pages are user-facing application screens in `src/pages/`.
|
|
8
|
+
|
|
9
|
+
## Page Structure
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
export default function PageName() {
|
|
13
|
+
return (
|
|
14
|
+
<div className="min-h-screen bg-background">
|
|
15
|
+
{/* Page content */}
|
|
16
|
+
<div className="container mx-auto p-6">
|
|
17
|
+
<div className="text-2xl font-bold text-foreground mb-6">
|
|
18
|
+
Page Title
|
|
19
|
+
</div>
|
|
20
|
+
{/* Content sections */}
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Layout Patterns
|
|
28
|
+
|
|
29
|
+
Use Tailwind utilities with design system colors:
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
// Card layout
|
|
33
|
+
<div className="bg-card border-default rounded-lg p-6">
|
|
34
|
+
{/* Card content */}
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
// Grid layout
|
|
38
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
39
|
+
{/* Grid items */}
|
|
40
|
+
</div>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Navigation
|
|
44
|
+
|
|
45
|
+
Add routes in `src/App.tsx`:
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
<Route path="/your-page" element={<YourPage />} />
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Styling Rules
|
|
52
|
+
|
|
53
|
+
- Use design system colors only: `bg-background`, `text-foreground`, `bg-card`
|
|
54
|
+
- Use opacity utilities: `text-foreground-80` (not `text-foreground/80`)
|
|
55
|
+
- Use border utilities: `border-default`, `border-bottom-default`
|
|
56
|
+
- Use `<div>` elements only (no `h1`, `p`, `section`)
|
|
57
|
+
|
|
58
|
+
## Theme Awareness
|
|
59
|
+
|
|
60
|
+
Pages automatically adapt to the active theme. Use theme context if needed:
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
import { useTheme } from "@/contexts/ThemeContext";
|
|
64
|
+
|
|
65
|
+
const { theme, setTheme } = useTheme();
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Component Usage
|
|
69
|
+
|
|
70
|
+
Always use wrapper components from `src/components/`:
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
import { ModusButton, ModusAlert, ModusCard } from "@/components";
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Never import `ModusWc*` components directly.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "**/*.css"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# CSS and Design System Patterns
|
|
6
|
+
|
|
7
|
+
This project uses Tailwind CSS 3 with a custom 9-color design system.
|
|
8
|
+
|
|
9
|
+
## Color Variables
|
|
10
|
+
|
|
11
|
+
Modus provides 9 CSS variables mapped to Tailwind utilities:
|
|
12
|
+
|
|
13
|
+
```css
|
|
14
|
+
/* Base colors */
|
|
15
|
+
--modus-wc-color-base-page /* bg-background */
|
|
16
|
+
--modus-wc-color-base-100 /* bg-card */
|
|
17
|
+
--modus-wc-color-base-200 /* bg-muted */
|
|
18
|
+
--modus-wc-color-base-300 /* bg-secondary */
|
|
19
|
+
--modus-wc-color-base-content /* text-foreground */
|
|
20
|
+
|
|
21
|
+
/* Semantic colors */
|
|
22
|
+
--modus-wc-color-info /* bg-primary, text-primary */
|
|
23
|
+
--modus-wc-color-success /* bg-success, text-success */
|
|
24
|
+
--modus-wc-color-warning /* bg-warning, text-warning */
|
|
25
|
+
--modus-wc-color-error /* bg-destructive, text-destructive */
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Custom Border Utilities
|
|
29
|
+
|
|
30
|
+
Tailwind's border-color doesn't work with CSS variables. Use custom utilities:
|
|
31
|
+
|
|
32
|
+
```css
|
|
33
|
+
/* Standard borders */
|
|
34
|
+
.border-default { border: 1px solid var(--modus-wc-color-base-200); }
|
|
35
|
+
.border-primary { border: 1px solid var(--modus-wc-color-info); }
|
|
36
|
+
.border-success { border: 1px solid var(--modus-wc-color-success); }
|
|
37
|
+
.border-warning { border: 1px solid var(--modus-wc-color-warning); }
|
|
38
|
+
.border-destructive { border: 1px solid var(--modus-wc-color-error); }
|
|
39
|
+
|
|
40
|
+
/* Directional borders */
|
|
41
|
+
.border-bottom-default { border-bottom: 1px solid var(--modus-wc-color-base-200); }
|
|
42
|
+
.border-top-default { border-top: 1px solid var(--modus-wc-color-base-200); }
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Custom Opacity Utilities
|
|
46
|
+
|
|
47
|
+
Tailwind's `/80` syntax doesn't work with CSS variables. Use color-mix():
|
|
48
|
+
|
|
49
|
+
```css
|
|
50
|
+
/* Text opacity */
|
|
51
|
+
.text-foreground-80 {
|
|
52
|
+
color: color-mix(in srgb, var(--modus-wc-color-base-content) 80%, transparent);
|
|
53
|
+
}
|
|
54
|
+
.text-foreground-60 {
|
|
55
|
+
color: color-mix(in srgb, var(--modus-wc-color-base-content) 60%, transparent);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* Background opacity */
|
|
59
|
+
.bg-primary-20 {
|
|
60
|
+
background-color: color-mix(in srgb, var(--modus-wc-color-info) 20%, transparent);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Forbidden Patterns
|
|
65
|
+
|
|
66
|
+
```css
|
|
67
|
+
/* NEVER use hardcoded colors */
|
|
68
|
+
.wrong { color: #000000; }
|
|
69
|
+
.wrong { background-color: rgb(0, 0, 0); }
|
|
70
|
+
|
|
71
|
+
/* NEVER use generic Tailwind colors in CSS */
|
|
72
|
+
/* Use the design system utilities instead */
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Theme Support
|
|
76
|
+
|
|
77
|
+
All CSS variables automatically update when the `data-theme` attribute changes on `<html>`. No additional CSS is needed for theme switching.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "**/*.ts,**/*.tsx"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# TypeScript Patterns for Modus Components
|
|
6
|
+
|
|
7
|
+
## Event Type Casting
|
|
8
|
+
|
|
9
|
+
Modus web components emit CustomEvents. Cast them properly:
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
const handleEvent = (event: Event) => {
|
|
13
|
+
const customEvent = event as CustomEvent<EventDetailType>;
|
|
14
|
+
const detail = customEvent.detail;
|
|
15
|
+
// Use detail
|
|
16
|
+
};
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Common Event Types
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
// Button click
|
|
23
|
+
(event: Event) => {
|
|
24
|
+
const customEvent = event as CustomEvent<MouseEvent | KeyboardEvent>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Input change
|
|
28
|
+
(event: Event) => {
|
|
29
|
+
const customEvent = event as CustomEvent<InputEvent>;
|
|
30
|
+
const value = (customEvent.target as HTMLInputElement).value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Checkbox (remember value is inverted!)
|
|
34
|
+
(event: Event) => {
|
|
35
|
+
const customEvent = event as CustomEvent<InputEvent>;
|
|
36
|
+
const rawValue = (customEvent.target as HTMLModusWcCheckboxElement).value;
|
|
37
|
+
const actualChecked = !rawValue; // Invert the value
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Component Ref Types
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import type { HTMLModusWcButtonElement } from "@trimble-oss/moduswebcomponents-react";
|
|
45
|
+
|
|
46
|
+
const buttonRef = useRef<HTMLModusWcButtonElement>(null);
|
|
47
|
+
const modalRef = useRef<HTMLModusWcModalElement>(null);
|
|
48
|
+
const checkboxRef = useRef<HTMLModusWcCheckboxElement>(null);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Modal Ref Pattern
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
interface ModusModalRef {
|
|
55
|
+
openModal: () => void;
|
|
56
|
+
closeModal: () => void;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const modalRef = useRef<ModusModalRef>(null);
|
|
60
|
+
modalRef.current?.openModal();
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Props Interfaces
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
interface ComponentProps {
|
|
67
|
+
color?: "primary" | "secondary" | "danger";
|
|
68
|
+
variant?: "filled" | "outlined" | "borderless";
|
|
69
|
+
size?: "sm" | "md" | "lg";
|
|
70
|
+
disabled?: boolean;
|
|
71
|
+
children?: React.ReactNode;
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Import Patterns
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
// Use wrapper components
|
|
79
|
+
import { ModusButton, ModusAlert } from "@/components";
|
|
80
|
+
|
|
81
|
+
// Import types from the web components package
|
|
82
|
+
import type {
|
|
83
|
+
HTMLModusWcButtonElement,
|
|
84
|
+
HTMLModusWcModalElement
|
|
85
|
+
} from "@trimble-oss/moduswebcomponents-react";
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Design System Types
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
type ThemeName =
|
|
92
|
+
| "modus-classic-light"
|
|
93
|
+
| "modus-classic-dark"
|
|
94
|
+
| "modus-modern-light"
|
|
95
|
+
| "modus-modern-dark"
|
|
96
|
+
| "connect-light"
|
|
97
|
+
| "connect-dark";
|
|
98
|
+
|
|
99
|
+
type ButtonColor = "primary" | "secondary" | "danger";
|
|
100
|
+
type ButtonVariant = "filled" | "outlined" | "borderless";
|
|
101
|
+
```
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Pull Request
|
|
2
|
+
|
|
3
|
+
## 📝 Description
|
|
4
|
+
|
|
5
|
+
<!-- Provide a brief description of the changes in this PR -->
|
|
6
|
+
|
|
7
|
+
## 🔗 Related Issue
|
|
8
|
+
|
|
9
|
+
<!-- Link to the issue this PR addresses -->
|
|
10
|
+
|
|
11
|
+
Fixes #(issue number)
|
|
12
|
+
|
|
13
|
+
## 🎯 Type of Change
|
|
14
|
+
|
|
15
|
+
<!-- Mark the relevant option with an "x" -->
|
|
16
|
+
|
|
17
|
+
- [ ] 🐛 Bug fix (non-breaking change that fixes an issue)
|
|
18
|
+
- [ ] ✨ New feature (non-breaking change that adds functionality)
|
|
19
|
+
- [ ] 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
|
20
|
+
- [ ] 📚 Documentation update
|
|
21
|
+
- [ ] 🎨 Style/UI changes
|
|
22
|
+
- [ ] ♻️ Code refactoring (no functional changes)
|
|
23
|
+
- [ ] ⚡ Performance improvement
|
|
24
|
+
- [ ] 🧪 Adding or updating tests
|
|
25
|
+
- [ ] 🔧 Build/CI changes
|
|
26
|
+
- [ ] 🏗️ Infrastructure changes
|
|
27
|
+
|
|
28
|
+
## 🧪 Testing
|
|
29
|
+
|
|
30
|
+
<!-- Describe the tests you ran and provide instructions for reviewers -->
|
|
31
|
+
|
|
32
|
+
### Manual Testing Checklist
|
|
33
|
+
|
|
34
|
+
- [ ] **Development server starts** without errors (`npm run dev`)
|
|
35
|
+
- [ ] **All demo pages load** correctly
|
|
36
|
+
- [ ] **Theme switching works** for all 6 themes (Classic/Modern/Connect, Light/Dark)
|
|
37
|
+
- [ ] **Icons display properly** with valid names
|
|
38
|
+
- [ ] **Colors follow Modus standards** (`npm run lint:colors` passes)
|
|
39
|
+
- [ ] **Modus styles are followed** (`npm run lint:styles` passes)
|
|
40
|
+
- [ ] **No semantic HTML is used** (`npm run lint:semantic` passes)
|
|
41
|
+
- [ ] **Modus icons are used correctly** (`npm run lint:icons` passes)
|
|
42
|
+
- [ ] **Border usage follows guidelines** (`npm run lint:borders` passes)
|
|
43
|
+
- [ ] **Responsive design** works on mobile and desktop
|
|
44
|
+
- [ ] **Accessibility** - tested with keyboard navigation
|
|
45
|
+
- [ ] **Build succeeds** (`npm run build`)
|
|
46
|
+
- [ ] **TypeScript compilation** passes (`npm run type-check`)
|
|
47
|
+
|
|
48
|
+
### Browser Testing
|
|
49
|
+
|
|
50
|
+
Tested in the following browsers:
|
|
51
|
+
|
|
52
|
+
- [ ] Chrome (latest)
|
|
53
|
+
- [ ] Firefox (latest)
|
|
54
|
+
- [ ] Safari (latest)
|
|
55
|
+
- [ ] Edge (latest)
|
|
56
|
+
|
|
57
|
+
### Component-Specific Testing (if applicable)
|
|
58
|
+
|
|
59
|
+
- [ ] **Modus Web Components** render correctly
|
|
60
|
+
- [ ] **React components** work as expected
|
|
61
|
+
- [ ] **Event handling** functions properly
|
|
62
|
+
- [ ] **Props and attributes** are properly typed
|
|
63
|
+
- [ ] **Accessibility attributes** are present (ARIA labels, roles)
|
|
64
|
+
- [ ] **Vite build process** works correctly
|
|
65
|
+
- [ ] **Tailwind CSS** integration works properly
|
|
66
|
+
|
|
67
|
+
## 📸 Screenshots
|
|
68
|
+
|
|
69
|
+
<!-- Add screenshots for UI changes -->
|
|
70
|
+
|
|
71
|
+
### Before
|
|
72
|
+
|
|
73
|
+
<!-- Screenshot of the current state -->
|
|
74
|
+
|
|
75
|
+
### After
|
|
76
|
+
|
|
77
|
+
<!-- Screenshot of the changes -->
|
|
78
|
+
|
|
79
|
+
## 🎨 Design System Compliance
|
|
80
|
+
|
|
81
|
+
<!-- Confirm compliance with Modus Design System -->
|
|
82
|
+
|
|
83
|
+
- [ ] **Uses only approved Modus colors** (9 total: 5 base + 4 semantic)
|
|
84
|
+
- [ ] **Uses valid Modus icon names** from the official list
|
|
85
|
+
- [ ] **Follows React + Vite component creation rules** (Tailwind classes, TypeScript interfaces)
|
|
86
|
+
- [ ] **Uses Tailwind classes instead of inline styles** (no `style={{}}` syntax)
|
|
87
|
+
- [ ] **Uses div elements instead of semantic HTML** (no `<h1>`, `<section>`, etc.)
|
|
88
|
+
- [ ] **Maintains theme compatibility** across all 6 Modus themes
|
|
89
|
+
- [ ] **Follows accessibility guidelines** (WCAG 2.1 AA compliance)
|
|
90
|
+
|
|
91
|
+
## 📋 Code Quality
|
|
92
|
+
|
|
93
|
+
<!-- Confirm code quality standards -->
|
|
94
|
+
|
|
95
|
+
- [ ] **Code follows project conventions** and style guide
|
|
96
|
+
- [ ] **TypeScript strict mode** compliance
|
|
97
|
+
- [ ] **ESLint rules** pass without warnings
|
|
98
|
+
- [ ] **No hardcoded values** - uses Modus design tokens
|
|
99
|
+
- [ ] **Proper error handling** implemented
|
|
100
|
+
- [ ] **Code is well-documented** with comments where needed
|
|
101
|
+
|
|
102
|
+
## 🔄 Breaking Changes
|
|
103
|
+
|
|
104
|
+
<!-- If this PR introduces breaking changes, describe them here -->
|
|
105
|
+
|
|
106
|
+
- [ ] This PR introduces breaking changes
|
|
107
|
+
- [ ] Migration guide provided (if applicable)
|
|
108
|
+
- [ ] Version bump required
|
|
109
|
+
|
|
110
|
+
**Breaking changes description:**
|
|
111
|
+
|
|
112
|
+
<!-- Describe any breaking changes and how to migrate -->
|
|
113
|
+
|
|
114
|
+
## 📚 Documentation
|
|
115
|
+
|
|
116
|
+
<!-- Confirm documentation updates -->
|
|
117
|
+
|
|
118
|
+
- [ ] **README.md** updated (if needed)
|
|
119
|
+
- [ ] **Code comments** added for complex logic
|
|
120
|
+
- [ ] **TypeScript definitions** updated (if needed)
|
|
121
|
+
- [ ] **Examples** provided for new features
|
|
122
|
+
- [ ] **Development rules** updated (if needed)
|
|
123
|
+
|
|
124
|
+
## 🔍 Review Checklist
|
|
125
|
+
|
|
126
|
+
<!-- For reviewers -->
|
|
127
|
+
|
|
128
|
+
### Code Review
|
|
129
|
+
|
|
130
|
+
- [ ] Code follows project patterns and conventions
|
|
131
|
+
- [ ] Logic is sound and handles edge cases
|
|
132
|
+
- [ ] Performance considerations addressed
|
|
133
|
+
- [ ] Security considerations addressed
|
|
134
|
+
- [ ] No code duplication or unnecessary complexity
|
|
135
|
+
|
|
136
|
+
### Design System Review
|
|
137
|
+
|
|
138
|
+
- [ ] Uses approved Modus colors and components
|
|
139
|
+
- [ ] Maintains visual consistency
|
|
140
|
+
- [ ] Responsive design implemented correctly
|
|
141
|
+
- [ ] Accessibility standards met
|
|
142
|
+
|
|
143
|
+
### Testing Review
|
|
144
|
+
|
|
145
|
+
- [ ] Adequate test coverage (manual or automated)
|
|
146
|
+
- [ ] Edge cases considered and tested
|
|
147
|
+
- [ ] Cross-browser compatibility verified
|
|
148
|
+
- [ ] Performance impact assessed
|
|
149
|
+
|
|
150
|
+
## 💬 Additional Notes
|
|
151
|
+
|
|
152
|
+
<!-- Add any additional context, concerns, or notes for reviewers -->
|
|
153
|
+
|
|
154
|
+
## 📝 Reviewer Instructions
|
|
155
|
+
|
|
156
|
+
<!-- Specific instructions for reviewers -->
|
|
157
|
+
|
|
158
|
+
1. **Pull and test locally:**
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
git checkout [branch-name]
|
|
162
|
+
npm install
|
|
163
|
+
npm run dev
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
2. **Test the specific changes:**
|
|
167
|
+
|
|
168
|
+
- Navigate to affected pages/components
|
|
169
|
+
- Test functionality described in this PR
|
|
170
|
+
- Verify no regressions in existing features
|
|
171
|
+
|
|
172
|
+
3. **Check compliance:**
|
|
173
|
+
- Run `npm run lint:colors` to verify color usage
|
|
174
|
+
- Run `npm run lint:styles` to verify no inline styles
|
|
175
|
+
- Run `npm run lint:semantic` to verify no semantic HTML
|
|
176
|
+
- Run `npm run lint:icons` to verify Modus icons usage
|
|
177
|
+
- Run `npm run lint:borders` to verify border usage
|
|
178
|
+
- Test theme switching if UI changes were made
|
|
179
|
+
- Verify accessibility with keyboard navigation
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
**By submitting this PR, I confirm that:**
|
|
184
|
+
|
|
185
|
+
- [ ] I have read and followed the [Contributing Guidelines](CONTRIBUTING.md)
|
|
186
|
+
- [ ] I have tested my changes thoroughly
|
|
187
|
+
- [ ] I have considered the impact on existing users
|
|
188
|
+
- [ ] I am willing to address feedback and make necessary changes
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build-and-test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- name: Checkout repository
|
|
15
|
+
uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Use Node.js 20
|
|
18
|
+
uses: actions/setup-node@v4
|
|
19
|
+
with:
|
|
20
|
+
node-version: "20"
|
|
21
|
+
cache: "npm"
|
|
22
|
+
|
|
23
|
+
- name: Install dependencies
|
|
24
|
+
run: npm ci
|
|
25
|
+
|
|
26
|
+
- name: Run linting
|
|
27
|
+
run: npm run lint
|
|
28
|
+
|
|
29
|
+
- name: Run type checks
|
|
30
|
+
run: npm run type-check
|
|
31
|
+
|
|
32
|
+
- name: Run Modus linting suite
|
|
33
|
+
run: |
|
|
34
|
+
npm run lint:colors
|
|
35
|
+
npm run lint:icons
|
|
36
|
+
npm run lint:semantic
|
|
37
|
+
npm run lint:styles
|
|
38
|
+
npm run lint:borders
|
|
39
|
+
npm run lint:opacity
|
|
40
|
+
npm run lint:icon-names
|
|
41
|
+
|
|
42
|
+
- name: Build application
|
|
43
|
+
run: npm run build
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: Claude Code Review
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, synchronize, ready_for_review, reopened]
|
|
6
|
+
# Optional: Only run on specific file changes
|
|
7
|
+
# paths:
|
|
8
|
+
# - "src/**/*.ts"
|
|
9
|
+
# - "src/**/*.tsx"
|
|
10
|
+
# - "src/**/*.js"
|
|
11
|
+
# - "src/**/*.jsx"
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
claude-review:
|
|
15
|
+
# Optional: Filter by PR author
|
|
16
|
+
# if: |
|
|
17
|
+
# github.event.pull_request.user.login == 'external-contributor' ||
|
|
18
|
+
# github.event.pull_request.user.login == 'new-developer' ||
|
|
19
|
+
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
|
|
20
|
+
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
pull-requests: read
|
|
25
|
+
issues: read
|
|
26
|
+
id-token: write
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
- name: Checkout repository
|
|
30
|
+
uses: actions/checkout@v4
|
|
31
|
+
with:
|
|
32
|
+
fetch-depth: 1
|
|
33
|
+
|
|
34
|
+
- name: Run Claude Code Review
|
|
35
|
+
id: claude-review
|
|
36
|
+
uses: anthropics/claude-code-action@v1
|
|
37
|
+
with:
|
|
38
|
+
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
39
|
+
plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
|
|
40
|
+
plugins: 'code-review@claude-code-plugins'
|
|
41
|
+
prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'
|
|
42
|
+
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
|
|
43
|
+
# or https://code.claude.com/docs/en/cli-reference for available options
|
|
44
|
+
|