@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,508 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Core React best practices for Modus Design System integration
|
|
3
|
+
globs: ["**/*.tsx", "**/*.ts"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus React Best Practices for Vite + SWC
|
|
8
|
+
|
|
9
|
+
## 🏗️ **Component Architecture**
|
|
10
|
+
|
|
11
|
+
### ✅ **Single Configurable Component Pattern**
|
|
12
|
+
|
|
13
|
+
**CRITICAL**: Create **one configurable component** instead of multiple specific components.
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
// ✅ CORRECT: Single configurable component
|
|
17
|
+
function ModusButton({
|
|
18
|
+
variant = "primary",
|
|
19
|
+
size = "md",
|
|
20
|
+
disabled = false,
|
|
21
|
+
children,
|
|
22
|
+
...props
|
|
23
|
+
}: ModusButtonProps) {
|
|
24
|
+
const baseClasses =
|
|
25
|
+
"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50";
|
|
26
|
+
|
|
27
|
+
const variantClasses = {
|
|
28
|
+
primary: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
29
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/90",
|
|
30
|
+
destructive:
|
|
31
|
+
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
32
|
+
outline:
|
|
33
|
+
"border border-border bg-background hover:bg-muted hover:text-muted-foreground",
|
|
34
|
+
ghost: "hover:bg-muted hover:text-muted-foreground",
|
|
35
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const sizeClasses = {
|
|
39
|
+
sm: "h-9 px-3 text-sm",
|
|
40
|
+
md: "h-10 px-4 py-2",
|
|
41
|
+
lg: "h-11 px-8",
|
|
42
|
+
icon: "h-10 w-10",
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<ModusWcButton
|
|
47
|
+
className={`${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]}`}
|
|
48
|
+
disabled={disabled}
|
|
49
|
+
{...props}
|
|
50
|
+
>
|
|
51
|
+
{children}
|
|
52
|
+
</ModusWcButton>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ❌ WRONG: Multiple specific components
|
|
57
|
+
function PrimaryButton({ children, ...props }) {
|
|
58
|
+
/* ... */
|
|
59
|
+
}
|
|
60
|
+
function SecondaryButton({ children, ...props }) {
|
|
61
|
+
/* ... */
|
|
62
|
+
}
|
|
63
|
+
function DestructiveButton({ children, ...props }) {
|
|
64
|
+
/* ... */
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### ✅ **Component Composition Pattern**
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
// ✅ CORRECT: Component composition
|
|
72
|
+
function Card({ children, className, ...props }: CardProps) {
|
|
73
|
+
return (
|
|
74
|
+
<div
|
|
75
|
+
className={`bg-card text-card-foreground border border-border rounded-lg ${className}`}
|
|
76
|
+
{...props}
|
|
77
|
+
>
|
|
78
|
+
{children}
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function CardHeader({ children, className, ...props }: CardHeaderProps) {
|
|
84
|
+
return (
|
|
85
|
+
<div className={`flex flex-col space-y-1.5 p-6 ${className}`} {...props}>
|
|
86
|
+
{children}
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function CardTitle({ children, className, ...props }: CardTitleProps) {
|
|
92
|
+
return (
|
|
93
|
+
<div
|
|
94
|
+
className={`text-2xl font-semibold leading-none tracking-tight ${className}`}
|
|
95
|
+
{...props}
|
|
96
|
+
>
|
|
97
|
+
{children}
|
|
98
|
+
</div>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function CardContent({ children, className, ...props }: CardContentProps) {
|
|
103
|
+
return (
|
|
104
|
+
<div className={`p-6 pt-0 ${className}`} {...props}>
|
|
105
|
+
{children}
|
|
106
|
+
</div>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Usage
|
|
111
|
+
<Card>
|
|
112
|
+
<CardHeader>
|
|
113
|
+
<CardTitle>Card Title</CardTitle>
|
|
114
|
+
</CardHeader>
|
|
115
|
+
<CardContent>
|
|
116
|
+
<div>Card content</div>
|
|
117
|
+
</CardContent>
|
|
118
|
+
</Card>;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 🎨 **Styling Architecture**
|
|
122
|
+
|
|
123
|
+
### ✅ **Design System Integration**
|
|
124
|
+
|
|
125
|
+
```tsx
|
|
126
|
+
// ✅ CORRECT: Design system color usage
|
|
127
|
+
function ThemedComponent() {
|
|
128
|
+
return (
|
|
129
|
+
<div className="bg-background text-foreground">
|
|
130
|
+
<div className="bg-card text-card-foreground border border-border rounded-lg p-4">
|
|
131
|
+
<div className="text-primary">Primary text</div>
|
|
132
|
+
<div className="text-secondary">Secondary text</div>
|
|
133
|
+
<div className="text-muted-foreground">Muted text</div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ❌ WRONG: Generic Tailwind colors
|
|
140
|
+
<div className="bg-blue-500 text-white border-gray-300">Generic colors</div>;
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### ✅ **Responsive Design Patterns**
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
// ✅ CORRECT: Responsive design with design system
|
|
147
|
+
function ResponsiveComponent() {
|
|
148
|
+
return (
|
|
149
|
+
<div
|
|
150
|
+
className="
|
|
151
|
+
grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4
|
|
152
|
+
p-4 md:p-6 lg:p-8
|
|
153
|
+
bg-background text-foreground
|
|
154
|
+
"
|
|
155
|
+
>
|
|
156
|
+
<div className="bg-card text-card-foreground border border-border rounded-lg p-4">
|
|
157
|
+
<div className="text-lg font-semibold mb-2">Card Title</div>
|
|
158
|
+
<div className="text-sm text-muted-foreground">Card description</div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### ✅ **Interactive States**
|
|
166
|
+
|
|
167
|
+
```tsx
|
|
168
|
+
// ✅ CORRECT: Interactive states with design system
|
|
169
|
+
function InteractiveComponent() {
|
|
170
|
+
return (
|
|
171
|
+
<div
|
|
172
|
+
className="
|
|
173
|
+
bg-card text-card-foreground border border-border rounded-lg p-4
|
|
174
|
+
hover:bg-card/80 hover:shadow-lg
|
|
175
|
+
focus:ring-2 focus:ring-ring focus:ring-offset-2
|
|
176
|
+
active:bg-card/90
|
|
177
|
+
transition-all duration-200
|
|
178
|
+
cursor-pointer
|
|
179
|
+
"
|
|
180
|
+
>
|
|
181
|
+
Interactive content
|
|
182
|
+
</div>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## 🎯 **Modus Web Components Integration**
|
|
188
|
+
|
|
189
|
+
### ✅ **Event Handling Patterns**
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
// ✅ CORRECT: Event handling with refs
|
|
193
|
+
function ModusComponent() {
|
|
194
|
+
const componentRef = useRef<ModusWcButton>(null);
|
|
195
|
+
|
|
196
|
+
useEffect(() => {
|
|
197
|
+
const component = componentRef.current;
|
|
198
|
+
if (!component) return;
|
|
199
|
+
|
|
200
|
+
const handleClick = (event: CustomEvent) => {
|
|
201
|
+
console.log("Button clicked:", event.detail);
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
component.addEventListener("click", handleClick);
|
|
205
|
+
|
|
206
|
+
return () => {
|
|
207
|
+
component.removeEventListener("click", handleClick);
|
|
208
|
+
};
|
|
209
|
+
}, []);
|
|
210
|
+
|
|
211
|
+
return <ModusWcButton ref={componentRef}>Click me</ModusWcButton>;
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### ✅ **State Management Patterns**
|
|
216
|
+
|
|
217
|
+
```tsx
|
|
218
|
+
// ✅ CORRECT: State management with Modus components
|
|
219
|
+
function StatefulComponent() {
|
|
220
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
221
|
+
const modalRef = useRef<ModusWcModal>(null);
|
|
222
|
+
|
|
223
|
+
const openModal = () => {
|
|
224
|
+
if (modalRef.current) {
|
|
225
|
+
const dialog = modalRef.current.querySelector(
|
|
226
|
+
"dialog"
|
|
227
|
+
) as HTMLDialogElement;
|
|
228
|
+
if (dialog) {
|
|
229
|
+
dialog.showModal();
|
|
230
|
+
setIsOpen(true);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
const closeModal = () => {
|
|
236
|
+
if (modalRef.current) {
|
|
237
|
+
const dialog = modalRef.current.querySelector(
|
|
238
|
+
"dialog"
|
|
239
|
+
) as HTMLDialogElement;
|
|
240
|
+
if (dialog) {
|
|
241
|
+
dialog.close();
|
|
242
|
+
setIsOpen(false);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
return (
|
|
248
|
+
<div>
|
|
249
|
+
<button onClick={openModal}>Open Modal</button>
|
|
250
|
+
<ModusWcModal ref={modalRef}>
|
|
251
|
+
<div slot="header">Modal Title</div>
|
|
252
|
+
<div slot="body">Modal content</div>
|
|
253
|
+
<div slot="footer">
|
|
254
|
+
<button onClick={closeModal}>Close</button>
|
|
255
|
+
</div>
|
|
256
|
+
</ModusWcModal>
|
|
257
|
+
</div>
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## 🚀 **Vite + React Specific Patterns**
|
|
263
|
+
|
|
264
|
+
### ✅ **Environment Variables**
|
|
265
|
+
|
|
266
|
+
```tsx
|
|
267
|
+
// ✅ CORRECT: Environment variables in Vite
|
|
268
|
+
function ApiComponent() {
|
|
269
|
+
const apiUrl = import.meta.env.VITE_API_URL;
|
|
270
|
+
const isDevelopment = import.meta.env.DEV;
|
|
271
|
+
|
|
272
|
+
return (
|
|
273
|
+
<div>
|
|
274
|
+
<div>API URL: {apiUrl}</div>
|
|
275
|
+
<div>Environment: {isDevelopment ? "Development" : "Production"}</div>
|
|
276
|
+
</div>
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### ✅ **Dynamic Imports**
|
|
282
|
+
|
|
283
|
+
```tsx
|
|
284
|
+
// ✅ CORRECT: Dynamic imports for code splitting
|
|
285
|
+
const LazyComponent = lazy(() => import("./LazyComponent"));
|
|
286
|
+
|
|
287
|
+
function App() {
|
|
288
|
+
return (
|
|
289
|
+
<Suspense fallback={<div>Loading...</div>}>
|
|
290
|
+
<LazyComponent />
|
|
291
|
+
</Suspense>
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### ✅ **Asset Imports**
|
|
297
|
+
|
|
298
|
+
```tsx
|
|
299
|
+
// ✅ CORRECT: Asset imports in Vite
|
|
300
|
+
import logoUrl from "./assets/logo.svg";
|
|
301
|
+
import heroImage from "./assets/hero.jpg";
|
|
302
|
+
|
|
303
|
+
function Header() {
|
|
304
|
+
return (
|
|
305
|
+
<div className="flex items-center space-x-4">
|
|
306
|
+
<img src={logoUrl} alt="Logo" className="h-8 w-8" />
|
|
307
|
+
<div className="text-xl font-bold text-foreground">App Title</div>
|
|
308
|
+
</div>
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## 🎨 **Theme Integration**
|
|
314
|
+
|
|
315
|
+
### ✅ **Theme-Aware Components**
|
|
316
|
+
|
|
317
|
+
```tsx
|
|
318
|
+
// ✅ CORRECT: Theme-aware component
|
|
319
|
+
function ThemedComponent() {
|
|
320
|
+
const { theme, isDark, isModern } = useTheme();
|
|
321
|
+
|
|
322
|
+
return (
|
|
323
|
+
<div
|
|
324
|
+
className={`
|
|
325
|
+
bg-background text-foreground
|
|
326
|
+
${isDark ? "border-border" : "border-border"}
|
|
327
|
+
transition-colors duration-200
|
|
328
|
+
`}
|
|
329
|
+
>
|
|
330
|
+
<div className="text-foreground">Current theme: {theme}</div>
|
|
331
|
+
<div className="text-muted-foreground">
|
|
332
|
+
Mode: {isDark ? "Dark" : "Light"}
|
|
333
|
+
</div>
|
|
334
|
+
<div className="text-muted-foreground">
|
|
335
|
+
Style: {isModern ? "Modern" : "Classic"}
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### ✅ **Conditional Theming**
|
|
343
|
+
|
|
344
|
+
```tsx
|
|
345
|
+
// ✅ CORRECT: Conditional theming
|
|
346
|
+
function ConditionalThemedComponent() {
|
|
347
|
+
const { theme } = useTheme();
|
|
348
|
+
|
|
349
|
+
const getThemeSpecificContent = () => {
|
|
350
|
+
switch (theme) {
|
|
351
|
+
case "modus-classic-light":
|
|
352
|
+
return "Classic Light Theme";
|
|
353
|
+
case "modus-classic-dark":
|
|
354
|
+
return "Classic Dark Theme";
|
|
355
|
+
case "modus-modern-light":
|
|
356
|
+
return "Modern Light Theme";
|
|
357
|
+
case "modus-modern-dark":
|
|
358
|
+
return "Modern Dark Theme";
|
|
359
|
+
case "connect-light":
|
|
360
|
+
return "Connect Light Theme";
|
|
361
|
+
case "connect-dark":
|
|
362
|
+
return "Connect Dark Theme";
|
|
363
|
+
default:
|
|
364
|
+
return "Default Theme";
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
return (
|
|
369
|
+
<div className="bg-background text-foreground p-4 rounded border border-border">
|
|
370
|
+
<div className="text-lg font-semibold">{getThemeSpecificContent()}</div>
|
|
371
|
+
</div>
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
## 🔧 **Performance Optimization**
|
|
377
|
+
|
|
378
|
+
### ✅ **Memoization Patterns**
|
|
379
|
+
|
|
380
|
+
```tsx
|
|
381
|
+
// ✅ CORRECT: Memoization for expensive components
|
|
382
|
+
const ExpensiveComponent = memo(function ExpensiveComponent({
|
|
383
|
+
data,
|
|
384
|
+
}: {
|
|
385
|
+
data: any[];
|
|
386
|
+
}) {
|
|
387
|
+
const processedData = useMemo(() => {
|
|
388
|
+
return data.map((item) => ({
|
|
389
|
+
...item,
|
|
390
|
+
processed: item.value * 2,
|
|
391
|
+
}));
|
|
392
|
+
}, [data]);
|
|
393
|
+
|
|
394
|
+
return (
|
|
395
|
+
<div className="space-y-2">
|
|
396
|
+
{processedData.map((item, index) => (
|
|
397
|
+
<div key={index} className="bg-card text-card-foreground p-2 rounded">
|
|
398
|
+
{item.processed}
|
|
399
|
+
</div>
|
|
400
|
+
))}
|
|
401
|
+
</div>
|
|
402
|
+
);
|
|
403
|
+
});
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### ✅ **Lazy Loading Patterns**
|
|
407
|
+
|
|
408
|
+
```tsx
|
|
409
|
+
// ✅ CORRECT: Lazy loading with Suspense
|
|
410
|
+
const LazyPage = lazy(() => import("./LazyPage"));
|
|
411
|
+
|
|
412
|
+
function App() {
|
|
413
|
+
return (
|
|
414
|
+
<Router>
|
|
415
|
+
<Routes>
|
|
416
|
+
<Route
|
|
417
|
+
path="/lazy"
|
|
418
|
+
element={
|
|
419
|
+
<Suspense
|
|
420
|
+
fallback={
|
|
421
|
+
<div className="flex items-center justify-center min-h-screen">
|
|
422
|
+
<div className="text-foreground">Loading...</div>
|
|
423
|
+
</div>
|
|
424
|
+
}
|
|
425
|
+
>
|
|
426
|
+
<LazyPage />
|
|
427
|
+
</Suspense>
|
|
428
|
+
}
|
|
429
|
+
/>
|
|
430
|
+
</Routes>
|
|
431
|
+
</Router>
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
## 🚫 **Common Anti-Patterns**
|
|
437
|
+
|
|
438
|
+
### ❌ **Don't Create Multiple Specific Components**
|
|
439
|
+
|
|
440
|
+
```tsx
|
|
441
|
+
// ❌ WRONG: Multiple specific components
|
|
442
|
+
function PrimaryButton() {
|
|
443
|
+
/* ... */
|
|
444
|
+
}
|
|
445
|
+
function SecondaryButton() {
|
|
446
|
+
/* ... */
|
|
447
|
+
}
|
|
448
|
+
function DestructiveButton() {
|
|
449
|
+
/* ... */
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// ✅ CORRECT: Single configurable component
|
|
453
|
+
function Button({ variant, ...props }) {
|
|
454
|
+
/* ... */
|
|
455
|
+
}
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### ❌ **Don't Use Generic Tailwind Colors**
|
|
459
|
+
|
|
460
|
+
```tsx
|
|
461
|
+
// ❌ WRONG: Generic Tailwind colors
|
|
462
|
+
<div className="bg-blue-500 text-white border-gray-300">
|
|
463
|
+
Generic colors
|
|
464
|
+
</div>
|
|
465
|
+
|
|
466
|
+
// ✅ CORRECT: Design system colors
|
|
467
|
+
<div className="bg-primary text-primary-foreground border-border">
|
|
468
|
+
Design system colors
|
|
469
|
+
</div>
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### ❌ **Don't Mix Color Systems**
|
|
473
|
+
|
|
474
|
+
```tsx
|
|
475
|
+
// ❌ WRONG: Mixing color systems
|
|
476
|
+
<div className="bg-background text-blue-500 border-red-300">
|
|
477
|
+
Mixed color systems
|
|
478
|
+
</div>
|
|
479
|
+
|
|
480
|
+
// ✅ CORRECT: Consistent design system
|
|
481
|
+
<div className="bg-background text-foreground border-border">
|
|
482
|
+
Consistent design system
|
|
483
|
+
</div>
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
## 🎯 **Key Takeaways**
|
|
487
|
+
|
|
488
|
+
1. **Single Configurable Components**: Create one configurable component instead of multiple specific ones
|
|
489
|
+
2. **Design System Colors**: Always use design system colors, never generic Tailwind colors
|
|
490
|
+
3. **Event Handling**: Use refs and event listeners for Modus Web Components
|
|
491
|
+
4. **Theme Integration**: Use theme context for conditional styling and content
|
|
492
|
+
5. **Performance**: Use memoization and lazy loading for optimization
|
|
493
|
+
6. **Vite Patterns**: Use Vite-specific patterns for environment variables and assets
|
|
494
|
+
|
|
495
|
+
## 🔍 **Best Practices Checklist**
|
|
496
|
+
|
|
497
|
+
- [ ] ✅ **Single Configurable Components**: One component with variants, not multiple specific components
|
|
498
|
+
- [ ] ✅ **Design System Colors**: Using design system colors exclusively
|
|
499
|
+
- [ ] ✅ **Event Handling**: Proper event handling with refs and listeners
|
|
500
|
+
- [ ] ✅ **Theme Integration**: Theme-aware components with conditional styling
|
|
501
|
+
- [ ] ✅ **Performance**: Memoization and lazy loading where appropriate
|
|
502
|
+
- [ ] ✅ **Vite Patterns**: Using Vite-specific patterns for environment and assets
|
|
503
|
+
- [ ] ✅ **Accessibility**: Proper accessibility with div elements and ARIA attributes
|
|
504
|
+
- [ ] ✅ **Consistency**: Consistent patterns across all components
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
**Remember: This React + Vite application follows a single configurable component pattern with design system integration. Always use design system colors, proper event handling with refs, and theme-aware components. Never use generic Tailwind colors or create multiple specific components.**
|