@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,492 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Critical bug fix for ModusWcCheckbox value property inversion
|
|
3
|
+
globs: ["**/components/ModusCheckbox*.tsx", "**/demos/**/page.tsx"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# ModusWcCheckbox Value Inversion Bug in React
|
|
8
|
+
|
|
9
|
+
## 🚨 **CRITICAL BUG: Checkbox Value Inversion**
|
|
10
|
+
|
|
11
|
+
**Problem**: The `ModusWcCheckbox` component has an inverted `value` property that causes unexpected behavior in React applications.
|
|
12
|
+
|
|
13
|
+
**Bug Details**:
|
|
14
|
+
|
|
15
|
+
- When checkbox is **checked**: `target.value` returns `false`
|
|
16
|
+
- When checkbox is **unchecked**: `target.value` returns `true`
|
|
17
|
+
- This is the **opposite** of what developers expect
|
|
18
|
+
- The bug occurs in the `inputChange` event's `target.value` property
|
|
19
|
+
|
|
20
|
+
## ❌ **The Problem in Action**
|
|
21
|
+
|
|
22
|
+
### ❌ **Expected vs Actual Behavior**
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
// ❌ WRONG: This doesn't work as expected
|
|
26
|
+
function CheckboxComponent() {
|
|
27
|
+
const [isChecked, setIsChecked] = useState(false);
|
|
28
|
+
|
|
29
|
+
const handleChange = (event: CustomEvent<InputEvent>) => {
|
|
30
|
+
const value = (event.target as HTMLModusWcCheckboxElement).value; // ❌ This is inverted!
|
|
31
|
+
console.log("Checkbox value:", value); // false when checked, true when unchecked
|
|
32
|
+
setIsChecked(value); // ❌ This sets wrong state
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<ModusWcCheckbox value={isChecked} onInputChange={handleChange}>
|
|
37
|
+
Checkbox Label
|
|
38
|
+
</ModusWcCheckbox>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### ❌ **Common Mistakes**
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
// ❌ WRONG: Direct value usage
|
|
47
|
+
const handleChange = (event: CustomEvent<InputEvent>) => {
|
|
48
|
+
const value = (event.target as HTMLModusWcCheckboxElement).value; // ❌ Inverted value
|
|
49
|
+
setState(value); // ❌ Wrong state
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// ❌ WRONG: Assuming value matches checked state
|
|
53
|
+
const handleChange = (event: CustomEvent<InputEvent>) => {
|
|
54
|
+
const value = (event.target as HTMLModusWcCheckboxElement).value; // ❌ false when checked
|
|
55
|
+
const isChecked = value; // ❌ Wrong assumption
|
|
56
|
+
updateUI(isChecked); // ❌ Wrong UI state
|
|
57
|
+
};
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## ✅ **Solution: Invert the Value**
|
|
61
|
+
|
|
62
|
+
### ✅ **Correct Pattern: Invert the Value**
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
// ✅ CORRECT: Always invert the value
|
|
66
|
+
function CheckboxComponent() {
|
|
67
|
+
const [isChecked, setIsChecked] = useState(false);
|
|
68
|
+
|
|
69
|
+
const handleChange = (event: CustomEvent<InputEvent>) => {
|
|
70
|
+
const value = (event.target as HTMLModusWcCheckboxElement).value;
|
|
71
|
+
const actualChecked = !value; // ✅ CORRECT: Invert the value
|
|
72
|
+
console.log("Checkbox value:", value); // false when checked
|
|
73
|
+
console.log("Actual checked:", actualChecked); // true when checked
|
|
74
|
+
setIsChecked(actualChecked);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<ModusWcCheckbox value={isChecked} onInputChange={handleChange}>
|
|
79
|
+
Checkbox Label
|
|
80
|
+
</ModusWcCheckbox>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### ✅ **Reusable Solution Pattern**
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
// ✅ CORRECT: Create a utility function
|
|
89
|
+
function useModusCheckbox(initialChecked = false) {
|
|
90
|
+
const [isChecked, setIsChecked] = useState(initialChecked);
|
|
91
|
+
|
|
92
|
+
const handleChange = (event: CustomEvent<InputEvent>) => {
|
|
93
|
+
const value = (event.target as HTMLModusWcCheckboxElement).value;
|
|
94
|
+
const actualChecked = !value; // ✅ CORRECT: Always invert
|
|
95
|
+
setIsChecked(actualChecked);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
return {
|
|
99
|
+
isChecked,
|
|
100
|
+
handleChange,
|
|
101
|
+
setChecked: setIsChecked,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ✅ CORRECT: Use the utility
|
|
106
|
+
function CheckboxComponent() {
|
|
107
|
+
const { isChecked, handleChange } = useModusCheckbox(false);
|
|
108
|
+
|
|
109
|
+
return (
|
|
110
|
+
<ModusWcCheckbox value={isChecked} onInputChange={handleChange}>
|
|
111
|
+
Checkbox Label
|
|
112
|
+
</ModusWcCheckbox>
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### ✅ **Wrapper Component Pattern (Recommended)**
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
// ✅ CORRECT: Create a wrapper component that handles the inversion
|
|
121
|
+
interface ModusCheckboxProps {
|
|
122
|
+
value?: boolean;
|
|
123
|
+
onValueChange?: (event: CustomEvent<boolean>) => void;
|
|
124
|
+
// ... other props
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function ModusCheckbox({ value, onValueChange, ...props }: ModusCheckboxProps) {
|
|
128
|
+
const checkboxRef = useRef<HTMLModusWcCheckboxElement>(null);
|
|
129
|
+
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
const checkbox = checkboxRef.current;
|
|
132
|
+
if (!checkbox || !onValueChange) return;
|
|
133
|
+
|
|
134
|
+
const handleValueChange = (event: Event) => {
|
|
135
|
+
const customEvent = event as CustomEvent<InputEvent>;
|
|
136
|
+
// 🚨 CRITICAL: Handle the value inversion bug
|
|
137
|
+
const rawValue = (customEvent.target as HTMLModusWcCheckboxElement).value;
|
|
138
|
+
const actualValue = !rawValue; // ✅ CORRECT: Invert the value
|
|
139
|
+
|
|
140
|
+
// Create a new event with the corrected value
|
|
141
|
+
const correctedEvent = new CustomEvent("valueChange", {
|
|
142
|
+
detail: actualValue,
|
|
143
|
+
bubbles: true,
|
|
144
|
+
cancelable: true,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
onValueChange(correctedEvent);
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
checkbox.addEventListener("inputChange", handleValueChange);
|
|
151
|
+
return () => checkbox.removeEventListener("inputChange", handleValueChange);
|
|
152
|
+
}, [onValueChange]);
|
|
153
|
+
|
|
154
|
+
return <ModusWcCheckbox ref={checkboxRef} value={value} {...props} />;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// ✅ CORRECT: Use the wrapper component
|
|
158
|
+
function MyComponent() {
|
|
159
|
+
const [isChecked, setIsChecked] = useState(false);
|
|
160
|
+
|
|
161
|
+
const handleChange = (event: CustomEvent<boolean>) => {
|
|
162
|
+
const value = event.detail; // ✅ This is now correct!
|
|
163
|
+
setIsChecked(value);
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
return (
|
|
167
|
+
<ModusCheckbox value={isChecked} onValueChange={handleChange}>
|
|
168
|
+
Checkbox Label
|
|
169
|
+
</ModusCheckbox>
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## 🎯 **Advanced Patterns**
|
|
175
|
+
|
|
176
|
+
### ✅ **Multiple Checkboxes with Inversion**
|
|
177
|
+
|
|
178
|
+
```tsx
|
|
179
|
+
// ✅ CORRECT: Handle multiple checkboxes
|
|
180
|
+
function MultipleCheckboxes() {
|
|
181
|
+
const [checkboxes, setCheckboxes] = useState({
|
|
182
|
+
option1: false,
|
|
183
|
+
option2: true,
|
|
184
|
+
option3: false,
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const handleCheckboxChange =
|
|
188
|
+
(key: string) => (event: CustomEvent<InputEvent>) => {
|
|
189
|
+
const value = (event.target as HTMLModusWcCheckboxElement).value;
|
|
190
|
+
const actualChecked = !value; // ✅ CORRECT: Invert value
|
|
191
|
+
|
|
192
|
+
setCheckboxes((prev) => ({
|
|
193
|
+
...prev,
|
|
194
|
+
[key]: actualChecked,
|
|
195
|
+
}));
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
return (
|
|
199
|
+
<div>
|
|
200
|
+
{Object.entries(checkboxes).map(([key, isChecked]) => (
|
|
201
|
+
<ModusWcCheckbox
|
|
202
|
+
key={key}
|
|
203
|
+
value={isChecked}
|
|
204
|
+
onInputChange={handleCheckboxChange(key)}
|
|
205
|
+
>
|
|
206
|
+
Option {key}
|
|
207
|
+
</ModusWcCheckbox>
|
|
208
|
+
))}
|
|
209
|
+
</div>
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### ✅ **Form Integration with Inversion**
|
|
215
|
+
|
|
216
|
+
```tsx
|
|
217
|
+
// ✅ CORRECT: Form with checkbox inversion
|
|
218
|
+
function FormWithCheckbox() {
|
|
219
|
+
const [formData, setFormData] = useState({
|
|
220
|
+
name: "",
|
|
221
|
+
email: "",
|
|
222
|
+
agreeToTerms: false,
|
|
223
|
+
subscribeNewsletter: false,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const handleCheckboxChange =
|
|
227
|
+
(field: string) => (event: CustomEvent<InputEvent>) => {
|
|
228
|
+
const value = (event.target as HTMLModusWcCheckboxElement).value;
|
|
229
|
+
const actualChecked = !value; // ✅ CORRECT: Invert value
|
|
230
|
+
|
|
231
|
+
setFormData((prev) => ({
|
|
232
|
+
...prev,
|
|
233
|
+
[field]: actualChecked,
|
|
234
|
+
}));
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
238
|
+
e.preventDefault();
|
|
239
|
+
console.log("Form data:", formData); // ✅ CORRECT: Actual checked states
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
return (
|
|
243
|
+
<form onSubmit={handleSubmit}>
|
|
244
|
+
<input
|
|
245
|
+
type="text"
|
|
246
|
+
value={formData.name}
|
|
247
|
+
onChange={(e) =>
|
|
248
|
+
setFormData((prev) => ({ ...prev, name: e.target.value }))
|
|
249
|
+
}
|
|
250
|
+
placeholder="Name"
|
|
251
|
+
/>
|
|
252
|
+
|
|
253
|
+
<ModusWcCheckbox
|
|
254
|
+
value={formData.agreeToTerms}
|
|
255
|
+
onInputChange={handleCheckboxChange("agreeToTerms")}
|
|
256
|
+
>
|
|
257
|
+
I agree to the terms and conditions
|
|
258
|
+
</ModusWcCheckbox>
|
|
259
|
+
|
|
260
|
+
<ModusWcCheckbox
|
|
261
|
+
value={formData.subscribeNewsletter}
|
|
262
|
+
onInputChange={handleCheckboxChange("subscribeNewsletter")}
|
|
263
|
+
>
|
|
264
|
+
Subscribe to newsletter
|
|
265
|
+
</ModusWcCheckbox>
|
|
266
|
+
|
|
267
|
+
<button type="submit">Submit</button>
|
|
268
|
+
</form>
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### ✅ **Checkbox with External State Management**
|
|
274
|
+
|
|
275
|
+
```tsx
|
|
276
|
+
// ✅ CORRECT: External state with inversion
|
|
277
|
+
function CheckboxWithExternalState() {
|
|
278
|
+
const [externalState, setExternalState] = useState({
|
|
279
|
+
isEnabled: false,
|
|
280
|
+
isVisible: true,
|
|
281
|
+
isRequired: false,
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
const handleCheckboxChange =
|
|
285
|
+
(field: keyof typeof externalState) => (event: CustomEvent) => {
|
|
286
|
+
const value = event.detail;
|
|
287
|
+
const actualChecked = !value; // ✅ CORRECT: Invert value
|
|
288
|
+
|
|
289
|
+
setExternalState((prev) => ({
|
|
290
|
+
...prev,
|
|
291
|
+
[field]: actualChecked,
|
|
292
|
+
}));
|
|
293
|
+
|
|
294
|
+
// ✅ CORRECT: Use actual checked state for side effects
|
|
295
|
+
if (field === "isEnabled" && actualChecked) {
|
|
296
|
+
console.log("Feature enabled");
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
return (
|
|
301
|
+
<div>
|
|
302
|
+
<ModusWcCheckbox
|
|
303
|
+
checked={externalState.isEnabled}
|
|
304
|
+
onValueChange={handleCheckboxChange("isEnabled")}
|
|
305
|
+
>
|
|
306
|
+
Enable Feature
|
|
307
|
+
</ModusWcCheckbox>
|
|
308
|
+
|
|
309
|
+
<ModusWcCheckbox
|
|
310
|
+
checked={externalState.isVisible}
|
|
311
|
+
onValueChange={handleCheckboxChange("isVisible")}
|
|
312
|
+
>
|
|
313
|
+
Make Visible
|
|
314
|
+
</ModusWcCheckbox>
|
|
315
|
+
|
|
316
|
+
<ModusWcCheckbox
|
|
317
|
+
checked={externalState.isRequired}
|
|
318
|
+
onValueChange={handleCheckboxChange("isRequired")}
|
|
319
|
+
>
|
|
320
|
+
Required Field
|
|
321
|
+
</ModusWcCheckbox>
|
|
322
|
+
</div>
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## 🔧 **Testing the Inversion Bug**
|
|
328
|
+
|
|
329
|
+
### ✅ **Test Pattern for Checkbox Inversion**
|
|
330
|
+
|
|
331
|
+
```tsx
|
|
332
|
+
// ✅ CORRECT: Test the inversion behavior
|
|
333
|
+
function TestCheckboxInversion() {
|
|
334
|
+
const [testResults, setTestResults] = useState<string[]>([]);
|
|
335
|
+
|
|
336
|
+
const handleChange = (event: CustomEvent) => {
|
|
337
|
+
const value = event.detail;
|
|
338
|
+
const actualChecked = !value; // ✅ CORRECT: Invert value
|
|
339
|
+
|
|
340
|
+
const result = `Value: ${value}, Actual Checked: ${actualChecked}`;
|
|
341
|
+
setTestResults((prev) => [...prev, result]);
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
return (
|
|
345
|
+
<div>
|
|
346
|
+
<ModusWcCheckbox onValueChange={handleChange}>
|
|
347
|
+
Test Checkbox (Click to see inversion)
|
|
348
|
+
</ModusWcCheckbox>
|
|
349
|
+
|
|
350
|
+
<div>
|
|
351
|
+
<h3>Test Results:</h3>
|
|
352
|
+
{testResults.map((result, index) => (
|
|
353
|
+
<div key={index}>{result}</div>
|
|
354
|
+
))}
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### ✅ **Debugging the Inversion**
|
|
362
|
+
|
|
363
|
+
```tsx
|
|
364
|
+
// ✅ CORRECT: Debug the inversion behavior
|
|
365
|
+
function DebugCheckboxInversion() {
|
|
366
|
+
const [debugInfo, setDebugInfo] = useState<{
|
|
367
|
+
value: boolean | null;
|
|
368
|
+
actualChecked: boolean | null;
|
|
369
|
+
timestamp: string;
|
|
370
|
+
} | null>(null);
|
|
371
|
+
|
|
372
|
+
const handleChange = (event: CustomEvent) => {
|
|
373
|
+
const value = event.detail;
|
|
374
|
+
const actualChecked = !value; // ✅ CORRECT: Invert value
|
|
375
|
+
|
|
376
|
+
setDebugInfo({
|
|
377
|
+
value,
|
|
378
|
+
actualChecked,
|
|
379
|
+
timestamp: new Date().toISOString(),
|
|
380
|
+
});
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
return (
|
|
384
|
+
<div>
|
|
385
|
+
<ModusWcCheckbox onValueChange={handleChange}>
|
|
386
|
+
Debug Checkbox
|
|
387
|
+
</ModusWcCheckbox>
|
|
388
|
+
|
|
389
|
+
{debugInfo && (
|
|
390
|
+
<div className="mt-4 p-4 bg-muted rounded">
|
|
391
|
+
<h3>Debug Info:</h3>
|
|
392
|
+
<p>Raw value: {debugInfo.value?.toString()}</p>
|
|
393
|
+
<p>Actual checked: {debugInfo.actualChecked?.toString()}</p>
|
|
394
|
+
<p>Timestamp: {debugInfo.timestamp}</p>
|
|
395
|
+
</div>
|
|
396
|
+
)}
|
|
397
|
+
</div>
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
## 🚫 **What NOT to Do**
|
|
403
|
+
|
|
404
|
+
### ❌ **Don't Use Raw Value**
|
|
405
|
+
|
|
406
|
+
```tsx
|
|
407
|
+
// ❌ WRONG: Don't use raw value directly
|
|
408
|
+
const handleChange = (event: CustomEvent) => {
|
|
409
|
+
const value = event.detail; // ❌ This is inverted
|
|
410
|
+
setState(value); // ❌ Wrong state
|
|
411
|
+
};
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
### ❌ **Don't Assume Value Matches Checked State**
|
|
415
|
+
|
|
416
|
+
```tsx
|
|
417
|
+
// ❌ WRONG: Don't assume value is correct
|
|
418
|
+
const handleChange = (event: CustomEvent) => {
|
|
419
|
+
const value = event.detail; // ❌ false when checked
|
|
420
|
+
const isChecked = value; // ❌ Wrong assumption
|
|
421
|
+
updateUI(isChecked); // ❌ Wrong UI
|
|
422
|
+
};
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### ❌ **Don't Ignore the Inversion**
|
|
426
|
+
|
|
427
|
+
```tsx
|
|
428
|
+
// ❌ WRONG: Don't ignore the inversion bug
|
|
429
|
+
const handleChange = (event: CustomEvent) => {
|
|
430
|
+
const value = event.detail; // ❌ Inverted value
|
|
431
|
+
// This will cause bugs in your application
|
|
432
|
+
setState(value); // ❌ Wrong state
|
|
433
|
+
};
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
## 🎯 **Key Takeaways**
|
|
437
|
+
|
|
438
|
+
1. **Always Invert the Value**: `const actualChecked = !value` where `value` comes from `event.target.value`
|
|
439
|
+
2. **Use Correct Event**: Listen to `inputChange` event, not `valueChange`
|
|
440
|
+
3. **Access Target Value**: Use `(event.target as HTMLModusWcCheckboxElement).value`
|
|
441
|
+
4. **Create Wrapper Components**: Best practice is to handle inversion in a wrapper component
|
|
442
|
+
5. **Test the Inversion**: Always test checkbox behavior with state management
|
|
443
|
+
6. **Document the Bug**: Make sure team knows about this issue
|
|
444
|
+
7. **Use Utility Functions**: Create reusable patterns for checkbox handling
|
|
445
|
+
|
|
446
|
+
## 🔍 **Affected Components**
|
|
447
|
+
|
|
448
|
+
This bug affects:
|
|
449
|
+
|
|
450
|
+
- ✅ `ModusWcCheckbox` - Primary affected component
|
|
451
|
+
- ✅ Any form with checkboxes
|
|
452
|
+
- ✅ Any state management with checkboxes
|
|
453
|
+
- ✅ Any checkbox validation logic
|
|
454
|
+
|
|
455
|
+
## 🛠️ **Migration Guide**
|
|
456
|
+
|
|
457
|
+
If you have existing code with this bug:
|
|
458
|
+
|
|
459
|
+
```tsx
|
|
460
|
+
// ❌ OLD CODE (with bug)
|
|
461
|
+
const handleChange = (event: CustomEvent) => {
|
|
462
|
+
const value = event.detail; // ❌ Wrong event detail
|
|
463
|
+
setState(value); // ❌ Wrong
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
// ✅ NEW CODE (fixed)
|
|
467
|
+
const handleChange = (event: CustomEvent<InputEvent>) => {
|
|
468
|
+
const value = (event.target as HTMLModusWcCheckboxElement).value;
|
|
469
|
+
const actualChecked = !value; // ✅ CORRECT: Invert
|
|
470
|
+
setState(actualChecked); // ✅ Correct
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
// ✅ BEST PRACTICE: Use wrapper component
|
|
474
|
+
function MyComponent() {
|
|
475
|
+
const [isChecked, setIsChecked] = useState(false);
|
|
476
|
+
|
|
477
|
+
const handleChange = (event: CustomEvent<boolean>) => {
|
|
478
|
+
const value = event.detail; // ✅ This is now correct with wrapper!
|
|
479
|
+
setState(value);
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
return (
|
|
483
|
+
<ModusCheckbox value={isChecked} onValueChange={handleChange}>
|
|
484
|
+
Label
|
|
485
|
+
</ModusCheckbox>
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
**Remember: This is a critical bug in the ModusWcCheckbox component. Always invert the value property to get the correct checked state. This bug affects all checkbox implementations in React applications using Modus Web Components.**
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Essential color usage rules for Modus Design System integration
|
|
3
|
+
globs: ["**/*.tsx", "**/*.ts"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Color Usage - Short
|
|
8
|
+
|
|
9
|
+
Essential color usage rules for Modus Design System integration.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Use design system colors only** - `bg-background`, `text-foreground`, `bg-primary`, etc.
|
|
14
|
+
- **Never use generic Tailwind colors** - No `bg-blue-500`, `text-gray-600`, etc.
|
|
15
|
+
- **Never use hardcoded values** - No hex colors, RGB values, or CSS variables
|
|
16
|
+
- **Use semantic color names** - `bg-destructive`, `text-warning`, `bg-success`
|
|
17
|
+
- **Follow color hierarchy** - Background → Card → Primary → Secondary → Muted → Accent
|
|
18
|
+
- **Use hover states** - `hover:bg-primary/90` for interactive elements
|
|
19
|
+
- **Test in all themes** - Ensure colors work in light and dark modes
|
|
20
|
+
|
|
21
|
+
## Reference
|
|
22
|
+
|
|
23
|
+
For detailed color system mapping, advanced usage patterns, and theme integration, fetch the full rule: `modus-color-usage-react`
|