@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,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Critical integration patterns for Modus Navbar with Side Navigation in React
|
|
3
|
+
globs: ["**/components/ModusNavbar*.tsx", "**/components/ModusSideNavigation*.tsx", "**/demos/**/page.tsx"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Navbar + Side Navigation - Short
|
|
8
|
+
|
|
9
|
+
Critical integration patterns for Modus Navbar with Side Navigation in React.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use ModusNavbar wrapper component** - Never use `ModusWcNavbar` directly
|
|
14
|
+
- **Pass props as native React objects** - Wrapper handles serialization
|
|
15
|
+
- **Sync via ref and state** - Set `expanded` on ref AND track in React state
|
|
16
|
+
- **Position side navigation absolutely** - Use `position: absolute`, `z-index: 999`
|
|
17
|
+
- **Account for collapsed width** - Add `margin-left: 4rem` to panel content
|
|
18
|
+
- **Listen for expandedChange events** - Keep React state in sync with web component
|
|
19
|
+
- **Collapse sub-menus when nav closes** - Reset sub-menu states on collapse
|
|
20
|
+
|
|
21
|
+
## Reference
|
|
22
|
+
|
|
23
|
+
For detailed patterns, layout structure, and common pitfalls, fetch the full rule: `modus-navbar-side-navigation-react`
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Critical integration patterns for Modus Navbar with Side Navigation in React
|
|
3
|
+
globs: ["**/components/ModusNavbar*.tsx", "**/components/ModusSideNavigation*.tsx", "**/demos/**/page.tsx"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Navbar + Side Navigation Integration
|
|
8
|
+
|
|
9
|
+
Critical patterns for integrating `ModusWcNavbar` with `ModusWcSideNavigation` in React applications.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use the ModusNavbar wrapper component** - Never use `ModusWcNavbar` directly
|
|
14
|
+
- **Pass props as native React objects** - Wrapper handles serialization
|
|
15
|
+
- **Sync navbar hamburger menu with side navigation** - Use `onMainMenuOpenChange` callback
|
|
16
|
+
- **Position side navigation absolutely** - Required for proper layering
|
|
17
|
+
- **Set explicit z-index** - Ensure side navigation renders above content
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## DO: Use ModusNavbar Wrapper Component
|
|
22
|
+
|
|
23
|
+
The `ModusNavbar` wrapper component handles prop serialization and event binding correctly.
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
// DO: Use the wrapper component
|
|
27
|
+
import ModusNavbar from "../../components/ModusNavbar";
|
|
28
|
+
|
|
29
|
+
<ModusNavbar
|
|
30
|
+
userCard={userCard}
|
|
31
|
+
visibility={{ mainMenu: true, user: true }}
|
|
32
|
+
onMainMenuOpenChange={handleNavbarMenuOpenChange}
|
|
33
|
+
/>;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## DON'T: Use ModusWcNavbar Directly
|
|
37
|
+
|
|
38
|
+
Direct usage causes prop serialization issues.
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
// DON'T: Direct usage won't work properly
|
|
42
|
+
import { ModusWcNavbar } from "@trimble-oss/moduswebcomponents-react";
|
|
43
|
+
|
|
44
|
+
<ModusWcNavbar
|
|
45
|
+
user-card={JSON.stringify(userCard)} // Won't work!
|
|
46
|
+
visibility={JSON.stringify({ mainMenu: true })} // Won't work!
|
|
47
|
+
/>;
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## DO: Sync Navbar with Side Navigation via Ref
|
|
53
|
+
|
|
54
|
+
Use a ref to directly set the `expanded` property on the side navigation.
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
const [navbarMenuExpanded, setNavbarMenuExpanded] = useState(false);
|
|
58
|
+
const sideNavRef = useRef<any>(null);
|
|
59
|
+
|
|
60
|
+
const handleNavbarMenuOpenChange = useCallback((isOpen: boolean) => {
|
|
61
|
+
setNavbarMenuExpanded(isOpen);
|
|
62
|
+
|
|
63
|
+
// Directly set expanded property on the web component
|
|
64
|
+
const sideNav = sideNavRef.current;
|
|
65
|
+
if (sideNav) {
|
|
66
|
+
sideNav.expanded = isOpen;
|
|
67
|
+
}
|
|
68
|
+
}, []);
|
|
69
|
+
|
|
70
|
+
<ModusNavbar
|
|
71
|
+
onMainMenuOpenChange={handleNavbarMenuOpenChange}
|
|
72
|
+
/>
|
|
73
|
+
|
|
74
|
+
<ModusWcSideNavigation
|
|
75
|
+
ref={sideNavRef}
|
|
76
|
+
expanded={navbarMenuExpanded}
|
|
77
|
+
/>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## DON'T: Rely Only on React State
|
|
81
|
+
|
|
82
|
+
React state alone won't trigger the web component to expand.
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
// DON'T: This alone won't work
|
|
86
|
+
const [expanded, setExpanded] = useState(false);
|
|
87
|
+
|
|
88
|
+
const handleMenuOpen = (isOpen: boolean) => {
|
|
89
|
+
setExpanded(isOpen); // Web component won't update!
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
<ModusWcSideNavigation expanded={expanded} />; // May not respond
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## DO: Position Side Navigation Absolutely with Z-Index
|
|
98
|
+
|
|
99
|
+
Side navigation uses `position: absolute` internally. Set proper CSS.
|
|
100
|
+
|
|
101
|
+
```css
|
|
102
|
+
.main-content-row {
|
|
103
|
+
display: flex;
|
|
104
|
+
flex: 1;
|
|
105
|
+
position: relative; /* Creates positioning context */
|
|
106
|
+
min-height: 500px;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.side-navigation {
|
|
110
|
+
position: absolute;
|
|
111
|
+
left: 0;
|
|
112
|
+
top: 0;
|
|
113
|
+
height: 100%;
|
|
114
|
+
z-index: 999; /* Ensure above content */
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.panel-content {
|
|
118
|
+
flex: 1;
|
|
119
|
+
padding: 1.5rem;
|
|
120
|
+
margin-left: 4rem; /* Account for collapsed nav width */
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## DON'T: Use Relative Positioning
|
|
125
|
+
|
|
126
|
+
Relative positioning causes the side navigation to be hidden by other content.
|
|
127
|
+
|
|
128
|
+
```css
|
|
129
|
+
/* DON'T: Side nav will be hidden */
|
|
130
|
+
.side-navigation {
|
|
131
|
+
position: relative; /* Wrong! */
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## DO: Listen for expandedChange Events
|
|
138
|
+
|
|
139
|
+
Keep React state in sync with web component state changes.
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
const sideNav = sideNavRef.current;
|
|
144
|
+
if (!sideNav) return;
|
|
145
|
+
|
|
146
|
+
const handleExpandedChange = (e: Event) => {
|
|
147
|
+
const customEvent = e as CustomEvent<boolean>;
|
|
148
|
+
setNavbarMenuExpanded(customEvent.detail);
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
sideNav.addEventListener("expandedChange", handleExpandedChange);
|
|
152
|
+
|
|
153
|
+
return () => {
|
|
154
|
+
sideNav.removeEventListener("expandedChange", handleExpandedChange);
|
|
155
|
+
};
|
|
156
|
+
}, []);
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## DO: Use Correct User Card Structure
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
const userCard = {
|
|
165
|
+
name: "John Doe",
|
|
166
|
+
email: "john.doe@example.com",
|
|
167
|
+
avatarSrc: "", // Optional
|
|
168
|
+
avatarAlt: "User Avatar", // Optional
|
|
169
|
+
};
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## DO: Handle Sub-Menu State When Side Nav Collapses
|
|
175
|
+
|
|
176
|
+
Collapse all sub-menus when the side navigation closes.
|
|
177
|
+
|
|
178
|
+
```tsx
|
|
179
|
+
const [subMenuStates, setSubMenuStates] = useState<Record<string, boolean>>({
|
|
180
|
+
charts: false,
|
|
181
|
+
maps: false,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const collapseAllSubMenus = () => {
|
|
185
|
+
setSubMenuStates({
|
|
186
|
+
charts: false,
|
|
187
|
+
maps: false,
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
const handleNavbarMenuOpenChange = useCallback((isOpen: boolean) => {
|
|
192
|
+
setNavbarMenuExpanded(isOpen);
|
|
193
|
+
|
|
194
|
+
if (!isOpen) {
|
|
195
|
+
collapseAllSubMenus(); // Reset sub-menus when collapsing
|
|
196
|
+
}
|
|
197
|
+
}, []);
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Required Layout Structure
|
|
203
|
+
|
|
204
|
+
```tsx
|
|
205
|
+
<div className="layout-with-navbar">
|
|
206
|
+
<ModusNavbar
|
|
207
|
+
userCard={userCard}
|
|
208
|
+
visibility={{ mainMenu: true, user: true }}
|
|
209
|
+
onMainMenuOpenChange={handleNavbarMenuOpenChange}
|
|
210
|
+
/>
|
|
211
|
+
|
|
212
|
+
<div className="main-content-row">
|
|
213
|
+
<ModusWcSideNavigation
|
|
214
|
+
ref={sideNavRef}
|
|
215
|
+
expanded={navbarMenuExpanded}
|
|
216
|
+
collapse-on-click-outside={true}
|
|
217
|
+
max-width="256px"
|
|
218
|
+
mode="push"
|
|
219
|
+
className="side-navigation"
|
|
220
|
+
>
|
|
221
|
+
<ModusWcMenu>
|
|
222
|
+
<ModusWcMenuItem label="Home" value="home">
|
|
223
|
+
<ModusWcIcon slot="start-icon" name="home" decorative={true} />
|
|
224
|
+
</ModusWcMenuItem>
|
|
225
|
+
</ModusWcMenu>
|
|
226
|
+
</ModusWcSideNavigation>
|
|
227
|
+
|
|
228
|
+
<div className="panel-content">{/* Main content here */}</div>
|
|
229
|
+
</div>
|
|
230
|
+
</div>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Common Pitfalls
|
|
236
|
+
|
|
237
|
+
1. **Hamburger menu not visible** - Use `ModusNavbar` wrapper, not `ModusWcNavbar` directly
|
|
238
|
+
2. **Side nav expands then immediately collapses** - Bind `expanded` prop to React state and set via ref
|
|
239
|
+
3. **Side nav hidden by content** - Use `position: absolute` and `z-index: 999`
|
|
240
|
+
4. **Events not firing** - Use `addEventListener` for web component custom events
|
|
241
|
+
5. **Props not updating** - Set properties directly on the ref for web components
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Reference Implementation
|
|
246
|
+
|
|
247
|
+
See `/src/demos/side-navigation-demo/page.tsx` for complete working examples.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Strict prohibition of emojis in React + Vite application
|
|
3
|
+
globs: ["**/*.tsx", "**/*.ts", "**/*.md"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus No Emojis - Short
|
|
8
|
+
|
|
9
|
+
Strict prohibition of emojis in React + Vite application.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Never use emojis in code** - No emoji characters in any code files
|
|
14
|
+
- **Never use emojis in components** - No emoji in JSX, content, or UI elements
|
|
15
|
+
- **Never use emojis in content** - No emoji in text, descriptions, or user-facing content
|
|
16
|
+
- **Use Modus icons instead** - Replace emojis with appropriate Modus icons
|
|
17
|
+
- **Use Unicode characters for symbols** - Use proper Unicode symbols when needed
|
|
18
|
+
- **Check all content** - Verify no emojis in comments, strings, or documentation
|
|
19
|
+
- **Use linting to catch violations** - Automated checks for emoji usage
|
|
20
|
+
|
|
21
|
+
## Reference
|
|
22
|
+
|
|
23
|
+
For detailed emoji prohibition guidelines, icon replacement patterns, and linting setup, fetch the full rule: `modus-no-emojis-react`
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Essential opacity utilities for Modus Design System colors in React + Vite
|
|
3
|
+
globs: ["**/*.tsx", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Opacity Utilities - Short
|
|
8
|
+
|
|
9
|
+
Essential opacity utilities for Modus Design System colors in React + Vite.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use custom opacity utilities, not Tailwind /80 syntax** - `text-foreground-80` not `text-foreground/80`
|
|
14
|
+
- **CSS variables don't work with Tailwind opacity modifiers** - Tailwind needs actual color values
|
|
15
|
+
- **Use color-mix() for opacity variants** - Modern CSS function for proper opacity calculation
|
|
16
|
+
- **All utilities defined in index.css** - No Tailwind config changes needed
|
|
17
|
+
- **Respects theme switching** - Works in all 6 Modus themes
|
|
18
|
+
- **Use semantic color names** - `foreground`, `primary`, `destructive`, etc.
|
|
19
|
+
|
|
20
|
+
## Available Utilities
|
|
21
|
+
|
|
22
|
+
### Opacity Levels
|
|
23
|
+
|
|
24
|
+
- **80%** - `text-foreground-80`, `bg-primary-80`, `border-destructive-80`
|
|
25
|
+
- **60%** - `text-foreground-60`, `bg-primary-60`, `border-destructive-60`
|
|
26
|
+
- **40%** - `text-foreground-40`, `bg-primary-40`, `border-destructive-40`
|
|
27
|
+
- **20%** - `text-foreground-20`, `bg-primary-20`, `border-destructive-20`
|
|
28
|
+
|
|
29
|
+
### Colors
|
|
30
|
+
|
|
31
|
+
- **foreground** - `text-foreground-80`, `bg-foreground-80`, `border-foreground-80`
|
|
32
|
+
- **muted-foreground** - `text-muted-foreground-80`, `bg-muted-foreground-80`
|
|
33
|
+
- **primary** - `text-primary-80`, `bg-primary-80`, `border-primary-80`
|
|
34
|
+
- **secondary** - `text-secondary-80`, `bg-secondary-80`
|
|
35
|
+
- **destructive** - `text-destructive-80`, `bg-destructive-80`, `border-destructive-80`
|
|
36
|
+
- **warning** - `text-warning-80`, `bg-warning-80`, `border-warning-80`
|
|
37
|
+
- **success** - `text-success-80`, `bg-success-80`, `border-success-80`
|
|
38
|
+
|
|
39
|
+
## Usage Examples
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
// ❌ This doesn't work with CSS variables
|
|
43
|
+
<div className="text-foreground/80">Text with 80% opacity</div>
|
|
44
|
+
|
|
45
|
+
// ✅ Use custom opacity utilities
|
|
46
|
+
<div className="text-foreground-80">Text with 80% opacity</div>
|
|
47
|
+
<div className="bg-primary-60">Primary background with 60% opacity</div>
|
|
48
|
+
<div className="border border-destructive-40">Destructive border with 40% opacity</div>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Common Patterns
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
// Text hierarchy
|
|
55
|
+
<div className="text-foreground">Main heading (100%)</div>
|
|
56
|
+
<div className="text-foreground-80">Subheading (80%)</div>
|
|
57
|
+
<div className="text-muted-foreground-60">Description (60%)</div>
|
|
58
|
+
|
|
59
|
+
// Interactive states
|
|
60
|
+
<button className="bg-primary hover:bg-primary-80 transition-colors">
|
|
61
|
+
Hover with opacity
|
|
62
|
+
</button>
|
|
63
|
+
|
|
64
|
+
// Overlay effects
|
|
65
|
+
<div className="bg-foreground-20 absolute inset-0 rounded-lg"></div>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Reference
|
|
69
|
+
|
|
70
|
+
For detailed implementation patterns, migration guide, and advanced techniques, fetch the full rule: `modus-opacity-utilities-react`
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Essential opacity utilities for Modus Design System colors in React + Vite
|
|
3
|
+
globs: ["**/*.tsx", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Opacity Utilities - React
|
|
8
|
+
|
|
9
|
+
Essential opacity utilities for Modus Design System colors in React + Vite.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use custom opacity utilities, not Tailwind /80 syntax** - `text-foreground-80` not `text-foreground/80`
|
|
14
|
+
- **CSS variables don't work with Tailwind opacity modifiers** - Tailwind needs actual color values
|
|
15
|
+
- **Use color-mix() for opacity variants** - Modern CSS function for proper opacity calculation
|
|
16
|
+
- **All utilities defined in index.css** - No Tailwind config changes needed
|
|
17
|
+
- **Respects theme switching** - Works in all 6 Modus themes
|
|
18
|
+
- **Use semantic color names** - `foreground`, `primary`, `destructive`, etc.
|
|
19
|
+
|
|
20
|
+
## Available Opacity Levels
|
|
21
|
+
|
|
22
|
+
- **80%** - `text-foreground-80`, `bg-primary-80`, `border-destructive-80`
|
|
23
|
+
- **60%** - `text-foreground-60`, `bg-primary-60`, `border-destructive-60`
|
|
24
|
+
- **40%** - `text-foreground-40`, `bg-primary-40`, `border-destructive-40`
|
|
25
|
+
- **20%** - `text-foreground-20`, `bg-primary-20`, `border-destructive-20`
|
|
26
|
+
|
|
27
|
+
## Available Colors
|
|
28
|
+
|
|
29
|
+
- **foreground** - `text-foreground-80`, `bg-foreground-80`, `border-foreground-80`
|
|
30
|
+
- **muted-foreground** - `text-muted-foreground-80`, `bg-muted-foreground-80`
|
|
31
|
+
- **primary** - `text-primary-80`, `bg-primary-80`, `border-primary-80`
|
|
32
|
+
- **secondary** - `text-secondary-80`, `bg-secondary-80`
|
|
33
|
+
- **destructive** - `text-destructive-80`, `bg-destructive-80`, `border-destructive-80`
|
|
34
|
+
- **warning** - `text-warning-80`, `bg-warning-80`, `border-warning-80`
|
|
35
|
+
- **success** - `text-success-80`, `bg-success-80`, `border-success-80`
|
|
36
|
+
|
|
37
|
+
## Usage Examples
|
|
38
|
+
|
|
39
|
+
### Text Opacity
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
// ❌ This doesn't work with CSS variables
|
|
43
|
+
<div className="text-foreground/80">Text with 80% opacity</div>
|
|
44
|
+
|
|
45
|
+
// ✅ Use custom opacity utilities
|
|
46
|
+
<div className="text-foreground-80">Text with 80% opacity</div>
|
|
47
|
+
<div className="text-primary-60">Primary text with 60% opacity</div>
|
|
48
|
+
<div className="text-muted-foreground-40">Muted text with 40% opacity</div>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Background Opacity
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
// ✅ Background opacity utilities
|
|
55
|
+
<div className="bg-primary-80">Primary background with 80% opacity</div>
|
|
56
|
+
<div className="bg-destructive-60">Destructive background with 60% opacity</div>
|
|
57
|
+
<div className="bg-warning-40">Warning background with 40% opacity</div>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Border Opacity
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
// ✅ Border opacity utilities
|
|
64
|
+
<div className="border border-primary-80">Primary border with 80% opacity</div>
|
|
65
|
+
<div className="border border-destructive-60">Destructive border with 60% opacity</div>
|
|
66
|
+
<div className="border border-success-40">Success border with 40% opacity</div>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Combined Usage
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
// ✅ Mix opacity utilities with other classes
|
|
73
|
+
<div className="p-4 bg-card border border-primary-40 rounded-lg">
|
|
74
|
+
<div className="text-foreground-80 mb-2">Title with 80% opacity</div>
|
|
75
|
+
<div className="text-muted-foreground-60">Description with 60% opacity</div>
|
|
76
|
+
</div>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Implementation Details
|
|
80
|
+
|
|
81
|
+
### CSS Custom Properties
|
|
82
|
+
|
|
83
|
+
```css
|
|
84
|
+
/* Opacity variants for design system colors */
|
|
85
|
+
--foreground-80: color-mix(in srgb, var(--foreground) 80%, transparent);
|
|
86
|
+
--foreground-60: color-mix(in srgb, var(--foreground) 60%, transparent);
|
|
87
|
+
--foreground-40: color-mix(in srgb, var(--foreground) 40%, transparent);
|
|
88
|
+
--foreground-20: color-mix(in srgb, var(--foreground) 20%, transparent);
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Tailwind Utilities
|
|
92
|
+
|
|
93
|
+
```css
|
|
94
|
+
.text-foreground-80 {
|
|
95
|
+
color: var(--foreground-80);
|
|
96
|
+
}
|
|
97
|
+
.text-foreground-60 {
|
|
98
|
+
color: var(--foreground-60);
|
|
99
|
+
}
|
|
100
|
+
.text-foreground-40 {
|
|
101
|
+
color: var(--foreground-40);
|
|
102
|
+
}
|
|
103
|
+
.text-foreground-20 {
|
|
104
|
+
color: var(--foreground-20);
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Common Patterns
|
|
109
|
+
|
|
110
|
+
### Subtle Text Hierarchy
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
<div className="space-y-2">
|
|
114
|
+
<div className="text-foreground">Main heading (100%)</div>
|
|
115
|
+
<div className="text-foreground-80">Subheading (80%)</div>
|
|
116
|
+
<div className="text-muted-foreground-60">Description (60%)</div>
|
|
117
|
+
<div className="text-muted-foreground-40">Caption (40%)</div>
|
|
118
|
+
</div>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Interactive States
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
<button className="bg-primary hover:bg-primary-80 transition-colors">
|
|
125
|
+
Hover with opacity
|
|
126
|
+
</button>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Overlay Effects
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
<div className="relative">
|
|
133
|
+
<div className="bg-foreground-20 absolute inset-0 rounded-lg"></div>
|
|
134
|
+
<div className="relative z-10 p-4">Content with overlay</div>
|
|
135
|
+
</div>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Browser Support
|
|
139
|
+
|
|
140
|
+
- **color-mix()** - Supported in all modern browsers (Chrome 111+, Firefox 113+, Safari 16.2+)
|
|
141
|
+
- **Fallback** - Gracefully degrades to full opacity in older browsers
|
|
142
|
+
- **Progressive enhancement** - Works without JavaScript
|
|
143
|
+
|
|
144
|
+
## Performance
|
|
145
|
+
|
|
146
|
+
- **CSS-only solution** - No JavaScript overhead
|
|
147
|
+
- **Efficient rendering** - Uses native CSS color-mix() function
|
|
148
|
+
- **Theme-aware** - Automatically updates with theme changes
|
|
149
|
+
- **No runtime calculations** - Pre-computed opacity values
|
|
150
|
+
|
|
151
|
+
## Migration Guide
|
|
152
|
+
|
|
153
|
+
### From Tailwind /80 syntax
|
|
154
|
+
|
|
155
|
+
```tsx
|
|
156
|
+
// ❌ Old (doesn't work with CSS variables)
|
|
157
|
+
<div className="text-foreground/80">Text</div>
|
|
158
|
+
<div className="bg-primary/60">Background</div>
|
|
159
|
+
<div className="border-destructive/40">Border</div>
|
|
160
|
+
|
|
161
|
+
// ✅ New (works with design system)
|
|
162
|
+
<div className="text-foreground-80">Text</div>
|
|
163
|
+
<div className="bg-primary-60">Background</div>
|
|
164
|
+
<div className="border-destructive-40">Border</div>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### From inline styles
|
|
168
|
+
|
|
169
|
+
```tsx
|
|
170
|
+
// ❌ Old (not theme-aware)
|
|
171
|
+
<div style={{ color: 'rgba(0, 0, 0, 0.8)' }}>Text</div>
|
|
172
|
+
|
|
173
|
+
// ✅ New (theme-aware)
|
|
174
|
+
<div className="text-foreground-80">Text</div>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Best Practices
|
|
178
|
+
|
|
179
|
+
- **Use semantic colors** - `foreground`, `primary`, `destructive` instead of generic colors
|
|
180
|
+
- **Maintain contrast ratios** - Ensure accessibility with opacity levels
|
|
181
|
+
- **Test in all themes** - Verify opacity works in light and dark modes
|
|
182
|
+
- **Use consistent opacity levels** - Stick to 80%, 60%, 40%, 20% for consistency
|
|
183
|
+
- **Combine with other utilities** - Mix with spacing, sizing, and layout classes
|
|
184
|
+
- **Document opacity choices** - Explain why specific opacity levels are used
|
|
185
|
+
|
|
186
|
+
## Troubleshooting
|
|
187
|
+
|
|
188
|
+
### Opacity not working
|
|
189
|
+
|
|
190
|
+
- Check if using custom utilities (`text-foreground-80`) not Tailwind syntax (`text-foreground/80`)
|
|
191
|
+
- Verify CSS custom properties are defined in `index.css`
|
|
192
|
+
- Ensure browser supports `color-mix()` function
|
|
193
|
+
|
|
194
|
+
### Theme switching issues
|
|
195
|
+
|
|
196
|
+
- Opacity utilities automatically respect theme changes
|
|
197
|
+
- No additional configuration needed for theme switching
|
|
198
|
+
- Test in both light and dark modes
|
|
199
|
+
|
|
200
|
+
### Performance concerns
|
|
201
|
+
|
|
202
|
+
- Opacity utilities are CSS-only and highly performant
|
|
203
|
+
- No JavaScript calculations or runtime overhead
|
|
204
|
+
- Uses native browser color-mix() function
|
|
205
|
+
|
|
206
|
+
## Reference
|
|
207
|
+
|
|
208
|
+
This rule provides comprehensive opacity utilities for Modus Design System colors, ensuring consistent and theme-aware opacity effects throughout the React application.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Core React best practices for Modus Design System integration
|
|
3
|
+
globs: ["**/*.tsx", "**/*.ts"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus React Best Practices - Short
|
|
8
|
+
|
|
9
|
+
Core React best practices for Modus Design System integration.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Single configurable components** - One component with variants, not multiple specific components
|
|
14
|
+
- **Use design system colors only** - Never use generic Tailwind colors or hardcoded values
|
|
15
|
+
- **Component composition pattern** - Build complex components from smaller, reusable pieces
|
|
16
|
+
- **Event handling with refs** - Use refs and event listeners for Modus Web Components
|
|
17
|
+
- **Theme-aware components** - Use theme context for conditional styling and content
|
|
18
|
+
- **Performance optimization** - Use memoization and lazy loading where appropriate
|
|
19
|
+
- **Vite-specific patterns** - Use environment variables, dynamic imports, and asset imports
|
|
20
|
+
|
|
21
|
+
## Reference
|
|
22
|
+
|
|
23
|
+
For detailed component patterns, styling architecture, and advanced React techniques, fetch the full rule: `modus-react-best-practices`
|