@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,642 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Tailwind CSS v3 with Modus Design System integration
|
|
3
|
+
globs: ["**/*.tsx", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Tailwind CSS Usage in React + Vite
|
|
8
|
+
|
|
9
|
+
## 🎨 **Tailwind v3 Integration**
|
|
10
|
+
|
|
11
|
+
**CRITICAL**: This React + Vite application uses **Tailwind CSS v3** (not v4) with Modus Design System integration.
|
|
12
|
+
|
|
13
|
+
**Configuration**: Tailwind v3 with design system colors mapped in `tailwind.config.js` and custom utilities in `src/index.css`
|
|
14
|
+
|
|
15
|
+
## ❌ **FORBIDDEN: Generic Tailwind Colors**
|
|
16
|
+
|
|
17
|
+
### ❌ **Never Use Generic Tailwind Color Classes**
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
// ❌ WRONG: Generic Tailwind color classes
|
|
21
|
+
className = "bg-blue-500 text-white border-gray-300";
|
|
22
|
+
className = "bg-red-400 text-yellow-200 border-green-500";
|
|
23
|
+
className = "bg-gray-100 text-black border-purple-300";
|
|
24
|
+
className = "bg-indigo-600 text-orange-100 border-pink-400";
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### ❌ **Never Use Hardcoded Colors**
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
// ❌ WRONG: Hardcoded colors
|
|
31
|
+
className="bg-[#ffffff] text-[#000000] border-[#e5e5e5]"
|
|
32
|
+
className="bg-[#3b82f6] text-[#ffffff] border-[#1d4ed8]"
|
|
33
|
+
style={{ backgroundColor: "#ffffff", color: "#000000" }}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### ❌ **Never Use Raw Modus Variables**
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
// ❌ WRONG: Raw Modus CSS variables
|
|
40
|
+
className="bg-[var(--modus-wc-color-base-page)]"
|
|
41
|
+
className="text-[var(--modus-wc-color-base-content)]"
|
|
42
|
+
style={{ backgroundColor: "var(--modus-wc-color-base-page)" }}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## ✅ **CORRECT: Design System Colors**
|
|
46
|
+
|
|
47
|
+
### ✅ **Use Design System Tailwind Classes**
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
// ✅ CORRECT: Design system colors
|
|
51
|
+
className = "bg-background text-foreground";
|
|
52
|
+
className = "bg-card text-card-foreground border border-border";
|
|
53
|
+
className = "bg-primary text-primary-foreground hover:bg-primary/90";
|
|
54
|
+
className = "bg-secondary text-secondary-foreground hover:bg-secondary/90";
|
|
55
|
+
className = "bg-muted text-muted-foreground";
|
|
56
|
+
className = "bg-accent text-accent-foreground";
|
|
57
|
+
className = "bg-destructive text-destructive-foreground";
|
|
58
|
+
className = "bg-warning text-warning-foreground";
|
|
59
|
+
className = "bg-success text-success-foreground";
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### ✅ **Available Design System Colors**
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
// ✅ CORRECT: All available design system colors
|
|
66
|
+
const designSystemColors = {
|
|
67
|
+
// Background colors
|
|
68
|
+
background: "bg-background",
|
|
69
|
+
card: "bg-card",
|
|
70
|
+
popover: "bg-popover",
|
|
71
|
+
sidebar: "bg-sidebar",
|
|
72
|
+
|
|
73
|
+
// Text colors
|
|
74
|
+
foreground: "text-foreground",
|
|
75
|
+
"card-foreground": "text-card-foreground",
|
|
76
|
+
"popover-foreground": "text-popover-foreground",
|
|
77
|
+
"sidebar-foreground": "text-sidebar-foreground",
|
|
78
|
+
|
|
79
|
+
// Primary colors
|
|
80
|
+
primary: "bg-primary",
|
|
81
|
+
"primary-foreground": "text-primary-foreground",
|
|
82
|
+
|
|
83
|
+
// Secondary colors
|
|
84
|
+
secondary: "bg-secondary",
|
|
85
|
+
"secondary-foreground": "text-secondary-foreground",
|
|
86
|
+
|
|
87
|
+
// Muted colors
|
|
88
|
+
muted: "bg-muted",
|
|
89
|
+
"muted-foreground": "text-muted-foreground",
|
|
90
|
+
|
|
91
|
+
// Accent colors
|
|
92
|
+
accent: "bg-accent",
|
|
93
|
+
"accent-foreground": "text-accent-foreground",
|
|
94
|
+
|
|
95
|
+
// Status colors
|
|
96
|
+
destructive: "bg-destructive",
|
|
97
|
+
"destructive-foreground": "text-destructive-foreground",
|
|
98
|
+
warning: "bg-warning",
|
|
99
|
+
"warning-foreground": "text-warning-foreground",
|
|
100
|
+
success: "bg-success",
|
|
101
|
+
"success-foreground": "text-success-foreground",
|
|
102
|
+
|
|
103
|
+
// Border colors
|
|
104
|
+
border: "border-border",
|
|
105
|
+
input: "border-input",
|
|
106
|
+
"sidebar-border": "border-sidebar-border",
|
|
107
|
+
|
|
108
|
+
// Ring colors
|
|
109
|
+
ring: "ring-ring",
|
|
110
|
+
"sidebar-ring": "ring-sidebar-ring",
|
|
111
|
+
|
|
112
|
+
// Chart colors
|
|
113
|
+
"chart-1": "bg-chart-1",
|
|
114
|
+
"chart-2": "bg-chart-2",
|
|
115
|
+
"chart-3": "bg-chart-3",
|
|
116
|
+
"chart-4": "bg-chart-4",
|
|
117
|
+
"chart-5": "bg-chart-5",
|
|
118
|
+
|
|
119
|
+
// Sidebar colors
|
|
120
|
+
sidebar: "bg-sidebar",
|
|
121
|
+
"sidebar-foreground": "text-sidebar-foreground",
|
|
122
|
+
"sidebar-primary": "bg-sidebar-primary",
|
|
123
|
+
"sidebar-primary-foreground": "text-sidebar-primary-foreground",
|
|
124
|
+
"sidebar-accent": "bg-sidebar-accent",
|
|
125
|
+
"sidebar-accent-foreground": "text-sidebar-accent-foreground",
|
|
126
|
+
"sidebar-border": "border-sidebar-border",
|
|
127
|
+
"sidebar-ring": "ring-sidebar-ring",
|
|
128
|
+
};
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 🎯 **Component Styling Patterns**
|
|
132
|
+
|
|
133
|
+
### ✅ **Button Components**
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
// ✅ CORRECT: Button with design system colors
|
|
137
|
+
function Button({
|
|
138
|
+
variant = "primary",
|
|
139
|
+
size = "md",
|
|
140
|
+
children,
|
|
141
|
+
...props
|
|
142
|
+
}: ButtonProps) {
|
|
143
|
+
const baseClasses =
|
|
144
|
+
"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";
|
|
145
|
+
|
|
146
|
+
const variantClasses = {
|
|
147
|
+
primary: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
148
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/90",
|
|
149
|
+
destructive:
|
|
150
|
+
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
151
|
+
outline:
|
|
152
|
+
"border border-border bg-background hover:bg-muted hover:text-muted-foreground",
|
|
153
|
+
ghost: "hover:bg-muted hover:text-muted-foreground",
|
|
154
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const sizeClasses = {
|
|
158
|
+
sm: "h-9 px-3 text-sm",
|
|
159
|
+
md: "h-10 px-4 py-2",
|
|
160
|
+
lg: "h-11 px-8",
|
|
161
|
+
icon: "h-10 w-10",
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
return (
|
|
165
|
+
<button
|
|
166
|
+
className={`${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]}`}
|
|
167
|
+
{...props}
|
|
168
|
+
>
|
|
169
|
+
{children}
|
|
170
|
+
</button>
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### ✅ **Card Components**
|
|
176
|
+
|
|
177
|
+
```tsx
|
|
178
|
+
// ✅ CORRECT: Card with design system colors
|
|
179
|
+
function Card({ children, className, ...props }: CardProps) {
|
|
180
|
+
return (
|
|
181
|
+
<div
|
|
182
|
+
className={`bg-card text-card-foreground border border-border rounded-lg ${className}`}
|
|
183
|
+
{...props}
|
|
184
|
+
>
|
|
185
|
+
{children}
|
|
186
|
+
</div>
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function CardHeader({ children, className, ...props }: CardHeaderProps) {
|
|
191
|
+
return (
|
|
192
|
+
<div className={`flex flex-col space-y-1.5 p-6 ${className}`} {...props}>
|
|
193
|
+
{children}
|
|
194
|
+
</div>
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function CardTitle({ children, className, ...props }: CardTitleProps) {
|
|
199
|
+
return (
|
|
200
|
+
<div
|
|
201
|
+
className={`text-2xl font-semibold leading-none tracking-tight ${className}`}
|
|
202
|
+
{...props}
|
|
203
|
+
>
|
|
204
|
+
{children}
|
|
205
|
+
</div>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function CardContent({ children, className, ...props }: CardContentProps) {
|
|
210
|
+
return (
|
|
211
|
+
<div className={`p-6 pt-0 ${className}`} {...props}>
|
|
212
|
+
{children}
|
|
213
|
+
</div>
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### ✅ **Form Components**
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
// ✅ CORRECT: Form with design system colors
|
|
222
|
+
function Input({ className, ...props }: InputProps) {
|
|
223
|
+
return (
|
|
224
|
+
<input
|
|
225
|
+
className={`flex h-10 w-full rounded-md border border-input bg-input px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${className}`}
|
|
226
|
+
{...props}
|
|
227
|
+
/>
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function Label({ className, ...props }: LabelProps) {
|
|
232
|
+
return (
|
|
233
|
+
<div
|
|
234
|
+
className={`text-sm font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70 ${className}`}
|
|
235
|
+
{...props}
|
|
236
|
+
/>
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function Textarea({ className, ...props }: TextareaProps) {
|
|
241
|
+
return (
|
|
242
|
+
<textarea
|
|
243
|
+
className={`flex min-h-[80px] w-full rounded-md border border-input bg-input px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${className}`}
|
|
244
|
+
{...props}
|
|
245
|
+
/>
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## 📝 **Typography Patterns**
|
|
251
|
+
|
|
252
|
+
### ✅ **Typography with Design System Colors**
|
|
253
|
+
|
|
254
|
+
```tsx
|
|
255
|
+
// ✅ CORRECT: Typography using design system colors
|
|
256
|
+
function TypographyExample() {
|
|
257
|
+
return (
|
|
258
|
+
<div className="space-y-4">
|
|
259
|
+
<div className="text-4xl font-bold text-foreground">Heading 1</div>
|
|
260
|
+
<div className="text-3xl font-semibold text-foreground">Heading 2</div>
|
|
261
|
+
<div className="text-2xl font-medium text-foreground">Heading 3</div>
|
|
262
|
+
<div className="text-xl font-medium text-foreground">Heading 4</div>
|
|
263
|
+
<div className="text-lg font-medium text-foreground">Heading 5</div>
|
|
264
|
+
<div className="text-base font-medium text-foreground">Heading 6</div>
|
|
265
|
+
|
|
266
|
+
<div className="text-base text-foreground">Regular paragraph text</div>
|
|
267
|
+
<div className="text-sm text-muted-foreground">Small text</div>
|
|
268
|
+
<div className="text-xs text-muted-foreground">Extra small text</div>
|
|
269
|
+
</div>
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### ✅ **Typography in Cards**
|
|
275
|
+
|
|
276
|
+
```tsx
|
|
277
|
+
// ✅ CORRECT: Typography within card components
|
|
278
|
+
function CardWithTypography() {
|
|
279
|
+
return (
|
|
280
|
+
<div className="bg-card text-card-foreground border border-border rounded-lg p-6">
|
|
281
|
+
<div className="text-2xl font-semibold text-card-foreground mb-2">
|
|
282
|
+
Card Title
|
|
283
|
+
</div>
|
|
284
|
+
<div className="text-base text-card-foreground mb-4">
|
|
285
|
+
Card description with proper typography hierarchy
|
|
286
|
+
</div>
|
|
287
|
+
<div className="text-sm text-muted-foreground">
|
|
288
|
+
Additional information
|
|
289
|
+
</div>
|
|
290
|
+
</div>
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### ✅ **Typography with Status Colors**
|
|
296
|
+
|
|
297
|
+
```tsx
|
|
298
|
+
// ✅ CORRECT: Typography with status colors
|
|
299
|
+
function StatusTypography() {
|
|
300
|
+
return (
|
|
301
|
+
<div className="space-y-2">
|
|
302
|
+
<div className="text-sm font-medium text-success">Success message</div>
|
|
303
|
+
<div className="text-sm font-medium text-warning">Warning message</div>
|
|
304
|
+
<div className="text-sm font-medium text-destructive">Error message</div>
|
|
305
|
+
<div className="text-sm font-medium text-primary">Info message</div>
|
|
306
|
+
</div>
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## 🎨 **Advanced Styling Patterns**
|
|
312
|
+
|
|
313
|
+
### ✅ **Responsive Design**
|
|
314
|
+
|
|
315
|
+
```tsx
|
|
316
|
+
// ✅ CORRECT: Responsive design with design system colors
|
|
317
|
+
function ResponsiveComponent() {
|
|
318
|
+
return (
|
|
319
|
+
<div
|
|
320
|
+
className="
|
|
321
|
+
grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4
|
|
322
|
+
p-4 md:p-6 lg:p-8
|
|
323
|
+
bg-background text-foreground
|
|
324
|
+
"
|
|
325
|
+
>
|
|
326
|
+
<div className="bg-card text-card-foreground border border-border rounded-lg p-4">
|
|
327
|
+
<div className="text-lg font-semibold mb-2">Card Title</div>
|
|
328
|
+
<div className="text-sm text-muted-foreground">Card description</div>
|
|
329
|
+
</div>
|
|
330
|
+
</div>
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### ✅ **Interactive States**
|
|
336
|
+
|
|
337
|
+
```tsx
|
|
338
|
+
// ✅ CORRECT: Interactive states with design system colors
|
|
339
|
+
function InteractiveComponent() {
|
|
340
|
+
return (
|
|
341
|
+
<div
|
|
342
|
+
className="
|
|
343
|
+
bg-card text-card-foreground border border-border rounded-lg p-4
|
|
344
|
+
hover:bg-card/80 hover:shadow-lg
|
|
345
|
+
focus:ring-2 focus:ring-ring focus:ring-offset-2
|
|
346
|
+
active:bg-card/90
|
|
347
|
+
transition-all duration-200
|
|
348
|
+
cursor-pointer
|
|
349
|
+
"
|
|
350
|
+
>
|
|
351
|
+
Interactive content
|
|
352
|
+
</div>
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### ✅ **Status Indicators**
|
|
358
|
+
|
|
359
|
+
```tsx
|
|
360
|
+
// ✅ CORRECT: Status indicators with design system colors
|
|
361
|
+
function StatusIndicator({
|
|
362
|
+
status,
|
|
363
|
+
}: {
|
|
364
|
+
status: "success" | "warning" | "error" | "info";
|
|
365
|
+
}) {
|
|
366
|
+
const statusClasses = {
|
|
367
|
+
success: "bg-success text-success-foreground border-success",
|
|
368
|
+
warning: "bg-warning text-warning-foreground border-warning",
|
|
369
|
+
error: "bg-destructive text-destructive-foreground border-destructive",
|
|
370
|
+
info: "bg-primary text-primary-foreground border-primary",
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
return (
|
|
374
|
+
<div className={`px-3 py-1 rounded border ${statusClasses[status]}`}>
|
|
375
|
+
{status}
|
|
376
|
+
</div>
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### ✅ **Sidebar Components**
|
|
382
|
+
|
|
383
|
+
```tsx
|
|
384
|
+
// ✅ CORRECT: Sidebar with design system colors
|
|
385
|
+
function SidebarComponent() {
|
|
386
|
+
return (
|
|
387
|
+
<div className="bg-sidebar text-sidebar-foreground border-sidebar-border">
|
|
388
|
+
<div className="p-4 border-b border-sidebar-border">
|
|
389
|
+
<div className="text-lg font-semibold text-sidebar-foreground">
|
|
390
|
+
Sidebar Title
|
|
391
|
+
</div>
|
|
392
|
+
</div>
|
|
393
|
+
<div className="p-4">
|
|
394
|
+
<div className="text-sm text-sidebar-foreground mb-2">Navigation</div>
|
|
395
|
+
<div className="space-y-1">
|
|
396
|
+
<div className="text-sm text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground p-2 rounded cursor-pointer">
|
|
397
|
+
Menu Item 1
|
|
398
|
+
</div>
|
|
399
|
+
<div className="text-sm text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground p-2 rounded cursor-pointer">
|
|
400
|
+
Menu Item 2
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
</div>
|
|
404
|
+
</div>
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### ✅ **Chart Components**
|
|
410
|
+
|
|
411
|
+
```tsx
|
|
412
|
+
// ✅ CORRECT: Chart components with design system colors
|
|
413
|
+
function ChartComponent() {
|
|
414
|
+
const chartData = [
|
|
415
|
+
{ label: "Series 1", value: 100, color: "bg-chart-1" },
|
|
416
|
+
{ label: "Series 2", value: 80, color: "bg-chart-2" },
|
|
417
|
+
{ label: "Series 3", value: 60, color: "bg-chart-3" },
|
|
418
|
+
{ label: "Series 4", value: 40, color: "bg-chart-4" },
|
|
419
|
+
];
|
|
420
|
+
|
|
421
|
+
return (
|
|
422
|
+
<div className="bg-card text-card-foreground border border-border rounded-lg p-6">
|
|
423
|
+
<div className="text-lg font-semibold text-card-foreground mb-4">
|
|
424
|
+
Chart Title
|
|
425
|
+
</div>
|
|
426
|
+
<div className="space-y-2">
|
|
427
|
+
{chartData.map((item, index) => (
|
|
428
|
+
<div key={index} className="flex items-center space-x-3">
|
|
429
|
+
<div className={`w-4 h-4 rounded ${item.color}`}></div>
|
|
430
|
+
<div className="text-sm text-card-foreground">{item.label}</div>
|
|
431
|
+
<div className="text-sm text-muted-foreground">{item.value}%</div>
|
|
432
|
+
</div>
|
|
433
|
+
))}
|
|
434
|
+
</div>
|
|
435
|
+
</div>
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
## 🔧 **Custom Utilities**
|
|
441
|
+
|
|
442
|
+
### ✅ **Border Utilities (Already Defined)**
|
|
443
|
+
|
|
444
|
+
```tsx
|
|
445
|
+
// ✅ CORRECT: Use custom border utilities from src/index.css
|
|
446
|
+
<div className="border-default">Default border</div>
|
|
447
|
+
<div className="border-thick">Thick border</div>
|
|
448
|
+
<div className="border-dashed">Dashed border</div>
|
|
449
|
+
<div className="border-success">Success border</div>
|
|
450
|
+
<div className="border-warning">Warning border</div>
|
|
451
|
+
<div className="border-destructive">Destructive border</div>
|
|
452
|
+
<div className="border-primary">Primary border</div>
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### ✅ **Directional Borders**
|
|
456
|
+
|
|
457
|
+
```tsx
|
|
458
|
+
// ✅ CORRECT: Directional border utilities
|
|
459
|
+
<div className="border-top-default">Top border</div>
|
|
460
|
+
<div className="border-bottom-default">Bottom border</div>
|
|
461
|
+
<div className="border-left-default">Left border</div>
|
|
462
|
+
<div className="border-right-default">Right border</div>
|
|
463
|
+
<div className="border-top-success">Top success border</div>
|
|
464
|
+
<div className="border-bottom-warning">Bottom warning border</div>
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
### ✅ **Elevation Utilities**
|
|
468
|
+
|
|
469
|
+
```tsx
|
|
470
|
+
// ✅ CORRECT: Use elevation utilities from src/index.css
|
|
471
|
+
<div className="shadow-sm">Small elevation</div>
|
|
472
|
+
<div className="shadow-md">Medium elevation</div>
|
|
473
|
+
<div className="shadow-lg">Large elevation</div>
|
|
474
|
+
<div className="shadow-xl">Extra large elevation</div>
|
|
475
|
+
|
|
476
|
+
// ✅ CORRECT: Custom elevation with design system
|
|
477
|
+
<div className="bg-card text-card-foreground border border-border rounded-lg shadow-sm">
|
|
478
|
+
Card with small elevation
|
|
479
|
+
</div>
|
|
480
|
+
<div className="bg-card text-card-foreground border border-border rounded-lg shadow-md">
|
|
481
|
+
Card with medium elevation
|
|
482
|
+
</div>
|
|
483
|
+
<div className="bg-card text-card-foreground border border-border rounded-lg shadow-lg">
|
|
484
|
+
Card with large elevation
|
|
485
|
+
</div>
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
## 🚫 **Common Anti-Patterns**
|
|
489
|
+
|
|
490
|
+
### ❌ **Don't Mix Color Systems**
|
|
491
|
+
|
|
492
|
+
```tsx
|
|
493
|
+
// ❌ WRONG: Mixing design system and generic colors
|
|
494
|
+
<div className="bg-background text-blue-500 border-red-300">
|
|
495
|
+
Mixed color systems
|
|
496
|
+
</div>
|
|
497
|
+
|
|
498
|
+
// ✅ CORRECT: Consistent design system
|
|
499
|
+
<div className="bg-background text-foreground border-border">
|
|
500
|
+
Consistent design system
|
|
501
|
+
</div>
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
### ❌ **Don't Use Generic Tailwind Colors**
|
|
505
|
+
|
|
506
|
+
```tsx
|
|
507
|
+
// ❌ WRONG: Generic Tailwind colors
|
|
508
|
+
<div className="bg-blue-500 text-white border-gray-300">
|
|
509
|
+
Generic colors
|
|
510
|
+
</div>
|
|
511
|
+
|
|
512
|
+
// ✅ CORRECT: Design system colors
|
|
513
|
+
<div className="bg-primary text-primary-foreground border-border">
|
|
514
|
+
Design system colors
|
|
515
|
+
</div>
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### ❌ **Don't Use Hardcoded Colors**
|
|
519
|
+
|
|
520
|
+
```tsx
|
|
521
|
+
// ❌ WRONG: Hardcoded colors
|
|
522
|
+
<div className="bg-[#ffffff] text-[#000000] border-[#e5e5e5]">
|
|
523
|
+
Hardcoded colors
|
|
524
|
+
</div>
|
|
525
|
+
|
|
526
|
+
// ✅ CORRECT: Design system colors
|
|
527
|
+
<div className="bg-background text-foreground border-border">
|
|
528
|
+
Design system colors
|
|
529
|
+
</div>
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
## 🎯 **Tailwind v3 Specific Patterns**
|
|
533
|
+
|
|
534
|
+
### ✅ **CSS Import Order**
|
|
535
|
+
|
|
536
|
+
```css
|
|
537
|
+
/* ✅ CORRECT: CSS import order in src/index.css */
|
|
538
|
+
@import url("https://cdn.jsdelivr.net/npm/@trimble-oss/modus-icons@1.17.0/dist/field-systems/fonts/modus-icons.css");
|
|
539
|
+
@import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;500;600;700&display=swap");
|
|
540
|
+
@tailwind base;
|
|
541
|
+
@tailwind components;
|
|
542
|
+
@tailwind utilities;
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### ✅ **Tailwind Configuration**
|
|
546
|
+
|
|
547
|
+
```js
|
|
548
|
+
// ✅ CORRECT: tailwind.config.js
|
|
549
|
+
export default {
|
|
550
|
+
content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
|
|
551
|
+
theme: {
|
|
552
|
+
extend: {
|
|
553
|
+
colors: {
|
|
554
|
+
background: "var(--background)",
|
|
555
|
+
foreground: "var(--foreground)",
|
|
556
|
+
card: "var(--card)",
|
|
557
|
+
"card-foreground": "var(--card-foreground)",
|
|
558
|
+
// ... other design system colors
|
|
559
|
+
},
|
|
560
|
+
fontFamily: {
|
|
561
|
+
sans: ["Open Sans", "sans-serif"],
|
|
562
|
+
},
|
|
563
|
+
},
|
|
564
|
+
},
|
|
565
|
+
plugins: [],
|
|
566
|
+
};
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
## 🔧 **Validation**
|
|
570
|
+
|
|
571
|
+
### ✅ **Linting Commands**
|
|
572
|
+
|
|
573
|
+
```bash
|
|
574
|
+
# Check for color violations
|
|
575
|
+
npm run lint:colors
|
|
576
|
+
|
|
577
|
+
# Check for inline styles
|
|
578
|
+
npm run lint:styles
|
|
579
|
+
|
|
580
|
+
# Check for border violations
|
|
581
|
+
npm run lint:borders
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
### ✅ **Color Testing**
|
|
585
|
+
|
|
586
|
+
```tsx
|
|
587
|
+
// ✅ CORRECT: Test design system colors
|
|
588
|
+
function ColorTest() {
|
|
589
|
+
const colorCombinations = [
|
|
590
|
+
{ bg: "bg-background", text: "text-foreground" },
|
|
591
|
+
{ bg: "bg-card", text: "text-card-foreground" },
|
|
592
|
+
{ bg: "bg-primary", text: "text-primary-foreground" },
|
|
593
|
+
{ bg: "bg-secondary", text: "text-secondary-foreground" },
|
|
594
|
+
{ bg: "bg-muted", text: "text-muted-foreground" },
|
|
595
|
+
{ bg: "bg-accent", text: "text-accent-foreground" },
|
|
596
|
+
{ bg: "bg-destructive", text: "text-destructive-foreground" },
|
|
597
|
+
{ bg: "bg-warning", text: "text-warning-foreground" },
|
|
598
|
+
{ bg: "bg-success", text: "text-success-foreground" },
|
|
599
|
+
{ bg: "bg-sidebar", text: "text-sidebar-foreground" },
|
|
600
|
+
{ bg: "bg-chart-1", text: "text-foreground" },
|
|
601
|
+
{ bg: "bg-chart-2", text: "text-foreground" },
|
|
602
|
+
{ bg: "bg-chart-3", text: "text-foreground" },
|
|
603
|
+
{ bg: "bg-chart-4", text: "text-foreground" },
|
|
604
|
+
];
|
|
605
|
+
|
|
606
|
+
return (
|
|
607
|
+
<div className="space-y-4">
|
|
608
|
+
{colorCombinations.map((combo, index) => (
|
|
609
|
+
<div key={index} className={`${combo.bg} ${combo.text} p-4 rounded`}>
|
|
610
|
+
{combo.bg} + {combo.text}
|
|
611
|
+
</div>
|
|
612
|
+
))}
|
|
613
|
+
</div>
|
|
614
|
+
);
|
|
615
|
+
}
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
## 🎯 **Key Takeaways**
|
|
619
|
+
|
|
620
|
+
1. **Use Design System Colors**: Always use design system Tailwind classes
|
|
621
|
+
2. **Never Use Generic Colors**: No generic Tailwind color classes
|
|
622
|
+
3. **Never Use Hardcoded Colors**: No hex, RGB, or hardcoded values
|
|
623
|
+
4. **Use Custom Utilities**: Leverage custom border utilities from `src/index.css`
|
|
624
|
+
5. **Tailwind v3**: This is Tailwind v3, not v4
|
|
625
|
+
|
|
626
|
+
## 🔍 **Tailwind Usage Checklist**
|
|
627
|
+
|
|
628
|
+
- [ ] ✅ **Design System Colors**: Using design system Tailwind classes exclusively
|
|
629
|
+
- [ ] ✅ **No Generic Colors**: No generic Tailwind color classes
|
|
630
|
+
- [ ] ✅ **No Hardcoded Colors**: No hex, RGB, or hardcoded values
|
|
631
|
+
- [ ] ✅ **Custom Utilities**: Using custom border utilities from `src/index.css`
|
|
632
|
+
- [ ] ✅ **Typography**: Using design system colors for typography
|
|
633
|
+
- [ ] ✅ **Sidebar Colors**: Using sidebar-specific design system colors
|
|
634
|
+
- [ ] ✅ **Chart Colors**: Using chart color utilities for data visualization
|
|
635
|
+
- [ ] ✅ **Elevation**: Using shadow utilities for depth and hierarchy
|
|
636
|
+
- [ ] ✅ **Tailwind v3**: Using Tailwind v3 patterns and configuration
|
|
637
|
+
- [ ] ✅ **CSS Import Order**: Proper CSS import order in `src/index.css`
|
|
638
|
+
- [ ] ✅ **Responsive Design**: Using responsive design patterns with design system colors
|
|
639
|
+
|
|
640
|
+
---
|
|
641
|
+
|
|
642
|
+
**Remember: This React + Vite application uses Tailwind CSS v3 with Modus Design System integration. Always use design system Tailwind classes, never generic Tailwind colors or hardcoded values. Use custom border utilities from `src/index.css` and maintain proper CSS import order.**
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 6 Modus themes with proper switching and persistence
|
|
3
|
+
globs: ["**/*.tsx", "**/*.ts"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Themes - Short
|
|
8
|
+
|
|
9
|
+
6 Modus themes with proper switching and persistence.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **6 Modus themes supported** - Classic Light/Dark, Modern Light/Dark, Connect Light/Dark
|
|
14
|
+
- **Use ThemeProvider and useTheme hook** - Proper theme context setup
|
|
15
|
+
- **Hydration safety** - Handle SSR/hydration with `mounted` state
|
|
16
|
+
- **Theme persistence** - Save to localStorage and restore on page load
|
|
17
|
+
- **Official data-theme attribute** - Use `data-theme` for theme switching
|
|
18
|
+
- **Theme-aware components** - Use theme context for conditional styling
|
|
19
|
+
- **Test all themes** - Verify components work in all 6 themes
|
|
20
|
+
|
|
21
|
+
## Reference
|
|
22
|
+
|
|
23
|
+
For detailed theme implementation, context patterns, and advanced theming techniques, fetch the full rule: `modus-themes-react`
|