@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,286 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Essential border usage rules for Modus Design System integration in Angular + Vite
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Border Usage Guidelines - Modus Design System (Angular)
|
|
8
|
+
|
|
9
|
+
## CRITICAL: Use Design System Border Utilities
|
|
10
|
+
|
|
11
|
+
When working with borders in this Angular + Vite app, always use custom design system border utilities instead of Tailwind color classes or inline styles.
|
|
12
|
+
|
|
13
|
+
## NEVER Do These
|
|
14
|
+
|
|
15
|
+
### 1. Tailwind Color Classes in Borders
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<!-- WRONG: Tailwind color classes -->
|
|
19
|
+
<div class="border border-red-500">Error message</div>
|
|
20
|
+
<div class="border-2 border-green-500">Success message</div>
|
|
21
|
+
<div class="border border-blue-500">Info message</div>
|
|
22
|
+
<div class="border border-yellow-500">Warning message</div>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 2. Inline Border Styles
|
|
26
|
+
|
|
27
|
+
```html
|
|
28
|
+
<!-- WRONG: Inline styles -->
|
|
29
|
+
<div [style.border]="'1px solid var(--border)'">Content</div>
|
|
30
|
+
<div [style.border]="'2px solid var(--modus-wc-color-success)'">Content</div>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 3. Generic Tailwind Border Classes
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<!-- WRONG: Generic Tailwind classes -->
|
|
37
|
+
<div class="border border-gray-300">Content</div>
|
|
38
|
+
<div class="border-2 border-slate-400">Content</div>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## ALWAYS Do These
|
|
42
|
+
|
|
43
|
+
### 1. Use Design System Border Utilities
|
|
44
|
+
|
|
45
|
+
```html
|
|
46
|
+
<!-- CORRECT: Design system utilities -->
|
|
47
|
+
<div class="border-default">Default border</div>
|
|
48
|
+
<div class="border-success">Success border</div>
|
|
49
|
+
<div class="border-warning">Warning border</div>
|
|
50
|
+
<div class="border-destructive">Error border</div>
|
|
51
|
+
<div class="border-primary">Primary border</div>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 2. Use Thick Border Utilities for Emphasis
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<!-- CORRECT: Thick borders for emphasis -->
|
|
58
|
+
<div class="border-thick">Default thick border</div>
|
|
59
|
+
<div class="border-thick-success">Success thick border</div>
|
|
60
|
+
<div class="border-thick-warning">Warning thick border</div>
|
|
61
|
+
<div class="border-thick-destructive">Error thick border</div>
|
|
62
|
+
<div class="border-thick-primary">Primary thick border</div>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 3. Use Directional Border Utilities
|
|
66
|
+
|
|
67
|
+
```html
|
|
68
|
+
<!-- CORRECT: Directional borders -->
|
|
69
|
+
<div class="border-top-default">Top border only</div>
|
|
70
|
+
<div class="border-bottom-default">Bottom border only</div>
|
|
71
|
+
<div class="border-left-default">Left border only</div>
|
|
72
|
+
<div class="border-right-default">Right border only</div>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 4. Use Dashed Border Utilities
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<!-- CORRECT: Dashed borders -->
|
|
79
|
+
<div class="border-dashed">1px dashed border</div>
|
|
80
|
+
<div class="border-thick-dashed">2px dashed border</div>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Available Border Utilities
|
|
84
|
+
|
|
85
|
+
### Standard Borders (1px)
|
|
86
|
+
|
|
87
|
+
```css
|
|
88
|
+
border-default /* 1px solid var(--border) */
|
|
89
|
+
border-success /* 1px solid var(--modus-wc-color-success) */
|
|
90
|
+
border-warning /* 1px solid var(--modus-wc-color-warning) */
|
|
91
|
+
border-destructive /* 1px solid var(--modus-wc-color-error) */
|
|
92
|
+
border-primary /* 1px solid var(--modus-wc-color-info) */
|
|
93
|
+
|
|
94
|
+
border-dashed /* 1px dashed var(--border) */
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Thick Borders (2px)
|
|
98
|
+
|
|
99
|
+
```css
|
|
100
|
+
border-thick /* 2px solid var(--border) */
|
|
101
|
+
border-thick-success /* 2px solid var(--modus-wc-color-success) */
|
|
102
|
+
border-thick-warning /* 2px solid var(--modus-wc-color-warning) */
|
|
103
|
+
border-thick-destructive /* 2px solid var(--modus-wc-color-error) */
|
|
104
|
+
border-thick-primary /* 2px solid var(--modus-wc-color-info) */
|
|
105
|
+
|
|
106
|
+
border-thick-dashed /* 2px dashed var(--border) */
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Directional Borders
|
|
110
|
+
|
|
111
|
+
```css
|
|
112
|
+
border-top-default /* border-top: 1px solid var(--border) */
|
|
113
|
+
border-bottom-default /* border-bottom: 1px solid var(--border) */
|
|
114
|
+
border-left-default /* border-left: 1px solid var(--border) */
|
|
115
|
+
border-right-default /* border-right: 1px solid var(--border) */
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Context-Specific Usage
|
|
119
|
+
|
|
120
|
+
### Success States
|
|
121
|
+
|
|
122
|
+
```html
|
|
123
|
+
<!-- CORRECT: Success borders -->
|
|
124
|
+
<div class="border-success">Success message</div>
|
|
125
|
+
<div class="border-thick-success">Important success</div>
|
|
126
|
+
<div class="border-top-success">Success indicator</div>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Warning States
|
|
130
|
+
|
|
131
|
+
```html
|
|
132
|
+
<!-- CORRECT: Warning borders -->
|
|
133
|
+
<div class="border-warning">Warning message</div>
|
|
134
|
+
<div class="border-thick-warning">Important warning</div>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Error States
|
|
138
|
+
|
|
139
|
+
```html
|
|
140
|
+
<!-- CORRECT: Error borders -->
|
|
141
|
+
<div class="border-destructive">Error message</div>
|
|
142
|
+
<div class="border-thick-destructive">Critical error</div>
|
|
143
|
+
<div class="border-bottom-destructive">Error indicator</div>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Primary/Info States
|
|
147
|
+
|
|
148
|
+
```html
|
|
149
|
+
<!-- CORRECT: Primary borders -->
|
|
150
|
+
<div class="border-primary">Info message</div>
|
|
151
|
+
<div class="border-thick-primary">Important info</div>
|
|
152
|
+
<div class="border-left-primary">Info indicator</div>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Common Violations and Fixes
|
|
156
|
+
|
|
157
|
+
### Violation: Tailwind Color Classes
|
|
158
|
+
|
|
159
|
+
```html
|
|
160
|
+
<!-- WRONG -->
|
|
161
|
+
<div class="border border-red-500">Error</div>
|
|
162
|
+
<div class="border-2 border-green-500">Success</div>
|
|
163
|
+
|
|
164
|
+
<!-- CORRECT -->
|
|
165
|
+
<div class="border-destructive">Error</div>
|
|
166
|
+
<div class="border-thick-success">Success</div>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Violation: Inline Styles
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<!-- WRONG -->
|
|
173
|
+
<div [style.border]="'1px solid var(--border)'">Content</div>
|
|
174
|
+
|
|
175
|
+
<!-- CORRECT -->
|
|
176
|
+
<div class="border-default">Content</div>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Reference Implementation
|
|
180
|
+
|
|
181
|
+
### Card Components
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
@Component({
|
|
185
|
+
template: `
|
|
186
|
+
<div class="bg-card border-default rounded-lg p-4">
|
|
187
|
+
<div class="text-lg font-semibold">Card Title</div>
|
|
188
|
+
<div class="text-muted-foreground">Card content</div>
|
|
189
|
+
</div>
|
|
190
|
+
`,
|
|
191
|
+
})
|
|
192
|
+
export class CardComponent {}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Alert Components
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
@Component({
|
|
199
|
+
template: `
|
|
200
|
+
<div class="bg-success/5 border-success rounded-lg p-4">
|
|
201
|
+
<div class="flex items-center">
|
|
202
|
+
<i class="modus-icons text-success mr-2">check_circle</i>
|
|
203
|
+
<div class="text-success font-medium">Success message</div>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
`,
|
|
207
|
+
})
|
|
208
|
+
export class SuccessAlertComponent {}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Form Components
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
@Component({
|
|
215
|
+
template: `
|
|
216
|
+
<div [class]="hasError() ? 'border-destructive' : 'border-default'" class="rounded-md p-3">
|
|
217
|
+
<modus-text-input
|
|
218
|
+
[value]="value()"
|
|
219
|
+
(inputChange)="handleChange($event)"
|
|
220
|
+
/>
|
|
221
|
+
</div>
|
|
222
|
+
`,
|
|
223
|
+
})
|
|
224
|
+
export class FormFieldComponent {
|
|
225
|
+
readonly value = input<string>('');
|
|
226
|
+
readonly hasError = input<boolean>(false);
|
|
227
|
+
readonly valueChange = output<string>();
|
|
228
|
+
|
|
229
|
+
handleChange(value: string): void {
|
|
230
|
+
this.valueChange.emit(value);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Linting and Validation
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# Check for border violations
|
|
239
|
+
npm run lint:borders
|
|
240
|
+
|
|
241
|
+
# All linting checks
|
|
242
|
+
npm run lint:all
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Quick Reference
|
|
246
|
+
|
|
247
|
+
```css
|
|
248
|
+
/* Default content */
|
|
249
|
+
border-default
|
|
250
|
+
|
|
251
|
+
/* Success states */
|
|
252
|
+
border-success
|
|
253
|
+
border-thick-success
|
|
254
|
+
|
|
255
|
+
/* Warning states */
|
|
256
|
+
border-warning
|
|
257
|
+
border-thick-warning
|
|
258
|
+
|
|
259
|
+
/* Error states */
|
|
260
|
+
border-destructive
|
|
261
|
+
border-thick-destructive
|
|
262
|
+
|
|
263
|
+
/* Primary states */
|
|
264
|
+
border-primary
|
|
265
|
+
border-thick-primary
|
|
266
|
+
|
|
267
|
+
/* Dashed borders */
|
|
268
|
+
border-dashed
|
|
269
|
+
border-thick-dashed
|
|
270
|
+
|
|
271
|
+
/* Directional borders */
|
|
272
|
+
border-top-default
|
|
273
|
+
border-bottom-default
|
|
274
|
+
border-left-default
|
|
275
|
+
border-right-default
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## Quick Checklist
|
|
279
|
+
|
|
280
|
+
- [ ] Using design system border utilities
|
|
281
|
+
- [ ] No Tailwind color classes in borders
|
|
282
|
+
- [ ] No inline border styles
|
|
283
|
+
- [ ] Using appropriate border thickness (default vs thick)
|
|
284
|
+
- [ ] Using contextual colors (success, warning, error, primary)
|
|
285
|
+
- [ ] Passing border linting checks
|
|
286
|
+
- [ ] Using directional borders when appropriate
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Critical patterns for ModusButton usage inside ModusButtonGroup in Angular
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Button Group Usage - Short
|
|
8
|
+
|
|
9
|
+
Critical pattern to avoid styling conflicts in button groups.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **No defaults for variant/color in ModusButton** - Defaults override button group settings
|
|
14
|
+
- **Group controls styling** - ModusButtonGroup applies variant/color to all child buttons
|
|
15
|
+
- **Don't set variant/color on buttons inside groups** - Let the group control them
|
|
16
|
+
- **Explicitly set props for standalone buttons** - When not in a group, set variant and color
|
|
17
|
+
- **Group uses setAttribute after load** - DOM manipulation requires no conflicting props
|
|
18
|
+
- **Test all three variants** - Outlined, filled, and borderless should look distinct
|
|
19
|
+
|
|
20
|
+
## Correct Patterns
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// CORRECT - No defaults, allows group to control
|
|
24
|
+
readonly color = input<ButtonColor | undefined>();
|
|
25
|
+
readonly variant = input<ButtonVariant | undefined>();
|
|
26
|
+
|
|
27
|
+
// WRONG - Defaults override group settings
|
|
28
|
+
readonly color = input<ButtonColor>('primary');
|
|
29
|
+
readonly variant = input<ButtonVariant>('filled');
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```html
|
|
33
|
+
<!-- CORRECT: Group controls all button styling -->
|
|
34
|
+
<modus-button-group variant="outlined" color="primary">
|
|
35
|
+
<modus-button>Button 1</modus-button>
|
|
36
|
+
<modus-button>Button 2</modus-button>
|
|
37
|
+
</modus-button-group>
|
|
38
|
+
|
|
39
|
+
<!-- WRONG: Individual button props override group -->
|
|
40
|
+
<modus-button-group variant="outlined">
|
|
41
|
+
<modus-button variant="filled">Button</modus-button>
|
|
42
|
+
</modus-button-group>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Reference
|
|
46
|
+
|
|
47
|
+
For detailed patterns and wrapper component implementation, fetch the full rule: `modus-angular-button-group-usage`
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Critical patterns for ModusButton usage inside ModusButtonGroup in Angular
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Button Group Usage in Angular
|
|
8
|
+
|
|
9
|
+
Critical patterns for using ModusButton components inside ModusButtonGroup.
|
|
10
|
+
|
|
11
|
+
## The Problem
|
|
12
|
+
|
|
13
|
+
When `ModusButton` has default values for `variant` and `color`, these explicit values **override** the `ModusButtonGroup`'s settings. This causes all buttons to look the same regardless of the group's variant prop.
|
|
14
|
+
|
|
15
|
+
## Root Cause
|
|
16
|
+
|
|
17
|
+
The `modus-wc-button-group` web component uses `setAttribute()` to apply its `variant` and `color` to child buttons **after** they load. If Angular buttons have explicit defaults, they override the group's settings.
|
|
18
|
+
|
|
19
|
+
## Correct Pattern
|
|
20
|
+
|
|
21
|
+
### ModusButton Wrapper Component
|
|
22
|
+
|
|
23
|
+
Do NOT set defaults for `variant` or `color` in the ModusButton wrapper:
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
// CORRECT - No defaults, allows inheritance from button group
|
|
27
|
+
@Component({
|
|
28
|
+
selector: 'modus-button',
|
|
29
|
+
template: `
|
|
30
|
+
<modus-wc-button
|
|
31
|
+
[color]="color() || null"
|
|
32
|
+
[variant]="variant() || null"
|
|
33
|
+
[size]="size()"
|
|
34
|
+
[disabled]="disabled()"
|
|
35
|
+
(buttonClick)="handleButtonClick($event)"
|
|
36
|
+
>
|
|
37
|
+
<ng-content />
|
|
38
|
+
</modus-wc-button>
|
|
39
|
+
`,
|
|
40
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
41
|
+
})
|
|
42
|
+
export class ModusButtonComponent {
|
|
43
|
+
// No defaults for color and variant - allows group to control
|
|
44
|
+
readonly color = input<ButtonColor | undefined>();
|
|
45
|
+
readonly variant = input<ButtonVariant | undefined>();
|
|
46
|
+
readonly size = input<ButtonSize>('md');
|
|
47
|
+
readonly disabled = input<boolean>(false);
|
|
48
|
+
|
|
49
|
+
readonly buttonClick = output<MouseEvent | KeyboardEvent>();
|
|
50
|
+
|
|
51
|
+
handleButtonClick(event: CustomEvent<MouseEvent | KeyboardEvent>): void {
|
|
52
|
+
if (!this.disabled()) {
|
|
53
|
+
this.buttonClick.emit(event.detail);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// WRONG - Defaults override button group settings
|
|
61
|
+
@Component({
|
|
62
|
+
selector: 'modus-button',
|
|
63
|
+
// ...
|
|
64
|
+
})
|
|
65
|
+
export class ModusButtonComponent {
|
|
66
|
+
readonly color = input<ButtonColor>('primary'); // BAD: Will override group's color
|
|
67
|
+
readonly variant = input<ButtonVariant>('filled'); // BAD: Will override group's variant
|
|
68
|
+
// ...
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Using ModusButton Standalone
|
|
73
|
+
|
|
74
|
+
When using `ModusButton` outside a button group, explicitly set the props you need:
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<!-- Standalone button - explicitly set variant and color -->
|
|
78
|
+
<modus-button variant="filled" color="primary" (buttonClick)="handleClick()">
|
|
79
|
+
Click Me
|
|
80
|
+
</modus-button>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Using ModusButton in a Button Group
|
|
84
|
+
|
|
85
|
+
When inside a `ModusButtonGroup`, do NOT set variant/color on individual buttons:
|
|
86
|
+
|
|
87
|
+
```html
|
|
88
|
+
<!-- CORRECT - Group controls all button styling -->
|
|
89
|
+
<modus-button-group variant="outlined" color="primary">
|
|
90
|
+
<modus-button (buttonClick)="handleClick1()">Button 1</modus-button>
|
|
91
|
+
<modus-button (buttonClick)="handleClick2()">Button 2</modus-button>
|
|
92
|
+
<modus-button (buttonClick)="handleClick3()">Button 3</modus-button>
|
|
93
|
+
</modus-button-group>
|
|
94
|
+
|
|
95
|
+
<!-- WRONG - Individual button props override group settings -->
|
|
96
|
+
<modus-button-group variant="outlined" color="primary">
|
|
97
|
+
<modus-button variant="filled" (buttonClick)="handleClick1()">Button 1</modus-button> <!-- BAD -->
|
|
98
|
+
<modus-button color="danger" (buttonClick)="handleClick2()">Button 2</modus-button> <!-- BAD -->
|
|
99
|
+
</modus-button-group>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## How ModusButtonGroup Works
|
|
103
|
+
|
|
104
|
+
The web component applies styling to children via DOM manipulation:
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
// Inside modus-wc-button-group.tsx
|
|
108
|
+
private syncButtonStates(): void {
|
|
109
|
+
this.buttonElements = this.el.querySelectorAll('modus-wc-button');
|
|
110
|
+
this.setButtonAttribute('variant', this.variant);
|
|
111
|
+
this.setButtonAttribute('color', this.color || null);
|
|
112
|
+
this.setButtonAttribute('disabled', this.disabled ? 'true' : null);
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
This only works if child buttons don't have explicit values that override the setAttribute calls.
|
|
117
|
+
|
|
118
|
+
## Angular-Specific Implementation
|
|
119
|
+
|
|
120
|
+
### Button Group Wrapper Component
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
@Component({
|
|
124
|
+
selector: 'modus-button-group',
|
|
125
|
+
template: `
|
|
126
|
+
<modus-wc-button-group
|
|
127
|
+
[variant]="variant()"
|
|
128
|
+
[color]="color()"
|
|
129
|
+
[disabled]="disabled()"
|
|
130
|
+
[size]="size()"
|
|
131
|
+
>
|
|
132
|
+
<ng-content />
|
|
133
|
+
</modus-wc-button-group>
|
|
134
|
+
`,
|
|
135
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
136
|
+
})
|
|
137
|
+
export class ModusButtonGroupComponent {
|
|
138
|
+
readonly variant = input<ButtonGroupVariant>('outlined');
|
|
139
|
+
readonly color = input<ButtonColor | undefined>();
|
|
140
|
+
readonly disabled = input<boolean>(false);
|
|
141
|
+
readonly size = input<ButtonSize>('md');
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Usage in Demo Pages
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
@Component({
|
|
149
|
+
template: `
|
|
150
|
+
<demo-example title="Button Group Variants">
|
|
151
|
+
<div class="space-y-4">
|
|
152
|
+
<div>
|
|
153
|
+
<div class="text-sm font-medium text-foreground mb-2">Outlined (default)</div>
|
|
154
|
+
<modus-button-group variant="outlined" color="primary">
|
|
155
|
+
<modus-button>Option 1</modus-button>
|
|
156
|
+
<modus-button>Option 2</modus-button>
|
|
157
|
+
<modus-button>Option 3</modus-button>
|
|
158
|
+
</modus-button-group>
|
|
159
|
+
</div>
|
|
160
|
+
|
|
161
|
+
<div>
|
|
162
|
+
<div class="text-sm font-medium text-foreground mb-2">Filled</div>
|
|
163
|
+
<modus-button-group variant="filled" color="primary">
|
|
164
|
+
<modus-button>Option 1</modus-button>
|
|
165
|
+
<modus-button>Option 2</modus-button>
|
|
166
|
+
<modus-button>Option 3</modus-button>
|
|
167
|
+
</modus-button-group>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
<div>
|
|
171
|
+
<div class="text-sm font-medium text-foreground mb-2">Borderless</div>
|
|
172
|
+
<modus-button-group variant="borderless" color="primary">
|
|
173
|
+
<modus-button>Option 1</modus-button>
|
|
174
|
+
<modus-button>Option 2</modus-button>
|
|
175
|
+
<modus-button>Option 3</modus-button>
|
|
176
|
+
</modus-button-group>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
</demo-example>
|
|
180
|
+
`,
|
|
181
|
+
})
|
|
182
|
+
export class ButtonGroupDemoComponent {}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Selection State Pattern
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
@Component({
|
|
189
|
+
template: `
|
|
190
|
+
<modus-button-group variant="outlined" color="primary">
|
|
191
|
+
@for (option of options(); track option.value) {
|
|
192
|
+
<modus-button
|
|
193
|
+
[class.bg-primary]="selectedValue() === option.value"
|
|
194
|
+
[class.text-white]="selectedValue() === option.value"
|
|
195
|
+
(buttonClick)="selectOption(option.value)"
|
|
196
|
+
>
|
|
197
|
+
{{ option.label }}
|
|
198
|
+
</modus-button>
|
|
199
|
+
}
|
|
200
|
+
</modus-button-group>
|
|
201
|
+
`,
|
|
202
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
203
|
+
})
|
|
204
|
+
export class ButtonGroupSelectionComponent {
|
|
205
|
+
readonly options = signal([
|
|
206
|
+
{ value: 'option1', label: 'Option 1' },
|
|
207
|
+
{ value: 'option2', label: 'Option 2' },
|
|
208
|
+
{ value: 'option3', label: 'Option 3' },
|
|
209
|
+
]);
|
|
210
|
+
|
|
211
|
+
readonly selectedValue = signal<string | null>(null);
|
|
212
|
+
|
|
213
|
+
selectOption(value: string): void {
|
|
214
|
+
this.selectedValue.set(value);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Quick Reference
|
|
220
|
+
|
|
221
|
+
| Context | variant | color | Notes |
|
|
222
|
+
| ------------------------------ | ---------------------- | ---------------------- | -------------------------------- |
|
|
223
|
+
| Standalone button | Set explicitly | Set explicitly | Button controls its own style |
|
|
224
|
+
| Inside button group | Do NOT set | Do NOT set | Group controls all button styles |
|
|
225
|
+
| Mixed (some grouped, some not) | Set only on standalone | Set only on standalone | Follow context rules |
|
|
226
|
+
|
|
227
|
+
## Testing Checklist
|
|
228
|
+
|
|
229
|
+
- [ ] Outlined variant shows bordered buttons with transparent background
|
|
230
|
+
- [ ] Filled variant shows solid colored buttons
|
|
231
|
+
- [ ] Borderless variant shows text-only buttons without borders
|
|
232
|
+
- [ ] Color prop applies consistently to all buttons in group
|
|
233
|
+
- [ ] Individual buttons don't override group styling
|
|
234
|
+
- [ ] Selection state works correctly (if applicable)
|
|
235
|
+
- [ ] Disabled state propagates from group to buttons
|
|
236
|
+
|
|
237
|
+
## Common Mistakes to Avoid
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
// WRONG: Setting defaults in component
|
|
241
|
+
readonly color = input<ButtonColor>('primary');
|
|
242
|
+
readonly variant = input<ButtonVariant>('filled');
|
|
243
|
+
|
|
244
|
+
// CORRECT: No defaults, use undefined
|
|
245
|
+
readonly color = input<ButtonColor | undefined>();
|
|
246
|
+
readonly variant = input<ButtonVariant | undefined>();
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
```html
|
|
250
|
+
<!-- WRONG: Setting props on buttons inside group -->
|
|
251
|
+
<modus-button-group variant="outlined">
|
|
252
|
+
<modus-button variant="filled">Button</modus-button>
|
|
253
|
+
</modus-button-group>
|
|
254
|
+
|
|
255
|
+
<!-- CORRECT: Let group control styling -->
|
|
256
|
+
<modus-button-group variant="outlined">
|
|
257
|
+
<modus-button>Button</modus-button>
|
|
258
|
+
</modus-button-group>
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
**Remember: When using buttons inside a button group, never set `variant` or `color` on individual buttons. The group controls all button styling through DOM manipulation, and explicit values on buttons will override the group's settings.**
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Critical bug fix for ModusWcCheckbox value property inversion in Angular
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Modus Checkbox Value Inversion - Short
|
|
8
|
+
|
|
9
|
+
Critical bug fix for ModusWcCheckbox value property inversion.
|
|
10
|
+
|
|
11
|
+
## Key Rules
|
|
12
|
+
|
|
13
|
+
- **Always invert checkbox value property** - `const actualChecked = !value` from `inputChange` event
|
|
14
|
+
- **Use wrapper components** - Create Angular wrapper to handle inversion automatically
|
|
15
|
+
- **Never trust the raw value** - The `value` property is inverted (false when checked, true when unchecked)
|
|
16
|
+
- **Handle in event handlers** - Invert value in `(inputChange)` event handler
|
|
17
|
+
- **Test thoroughly** - Verify checkbox behavior matches expected state
|
|
18
|
+
|
|
19
|
+
## Bug Details
|
|
20
|
+
|
|
21
|
+
- When checkbox is **checked**: `target.value` returns `false`
|
|
22
|
+
- When checkbox is **unchecked**: `target.value` returns `true`
|
|
23
|
+
|
|
24
|
+
## Correct Pattern
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
handleChange(event: CustomEvent<InputEvent>): void {
|
|
28
|
+
const value = (event.target as HTMLModusWcCheckboxElement).value;
|
|
29
|
+
const actualChecked = !value; // CRITICAL: Always invert
|
|
30
|
+
this.isChecked.set(actualChecked);
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Reference
|
|
35
|
+
|
|
36
|
+
For detailed bug explanation, wrapper component patterns, and utility functions, fetch the full rule: `modus-angular-checkbox-value-inversion`
|