@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,514 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Gestalt Laws implementation guide for UI design with Modus Design System
|
|
3
|
+
globs: ["**/*.ts", "**/*.html", "**/*.scss", "**/*.css"]
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Gestalt Laws in UI Design
|
|
8
|
+
|
|
9
|
+
**Scope**: Comprehensive Gestalt Laws with Real-World Examples and Modus Design System Integration for Angular
|
|
10
|
+
|
|
11
|
+
The Gestalt Laws are fundamental principles of visual perception that explain how humans naturally organize visual elements. When applied to UI design, these laws create intuitive, user-friendly interfaces that feel natural and reduce cognitive load.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Law of Proximity
|
|
16
|
+
|
|
17
|
+
**Definition:** Elements that are close together are perceived as related or grouped together.
|
|
18
|
+
|
|
19
|
+
**Real-World Example:** In a contact list, the name, phone number, and email address for each person are grouped closely together with small gaps (`gap-2`), while each contact is separated by larger gaps (`gap-6` to `gap-8`) from other contacts.
|
|
20
|
+
|
|
21
|
+
**Implementation:**
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<!-- Contact list example -->
|
|
25
|
+
<div class="space-y-6">
|
|
26
|
+
@for (contact of contacts(); track contact.id) {
|
|
27
|
+
<div class="flex items-center gap-2 p-4 bg-card border-default rounded-lg">
|
|
28
|
+
<modus-avatar [name]="contact.name" size="md" />
|
|
29
|
+
<div class="flex flex-col gap-1">
|
|
30
|
+
<div class="text-foreground font-medium">{{ contact.name }}</div>
|
|
31
|
+
<div class="text-foreground-60 text-sm">{{ contact.email }}</div>
|
|
32
|
+
<div class="text-foreground-60 text-sm">{{ contact.phone }}</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
}
|
|
36
|
+
</div>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Key Rules:**
|
|
40
|
+
|
|
41
|
+
- Use `gap-2` for related elements within a group
|
|
42
|
+
- Use `gap-6` to `gap-8` for separation between different groups
|
|
43
|
+
- Group form labels with their inputs using `gap-2`
|
|
44
|
+
- Separate different sections with `gap-6` or larger
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 2. Law of Similarity
|
|
49
|
+
|
|
50
|
+
**Definition:** Elements that look similar (same color, shape, size, or style) are perceived as related or belonging to the same category.
|
|
51
|
+
|
|
52
|
+
**Real-World Example:** In a dashboard, all primary action buttons use the same `color="primary"` style, all secondary actions use `color="secondary"`, and all destructive actions use `color="danger"`. This creates visual consistency that users can quickly understand.
|
|
53
|
+
|
|
54
|
+
**Implementation:**
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<!-- Dashboard action buttons -->
|
|
58
|
+
<div class="flex gap-4">
|
|
59
|
+
<modus-button color="primary" size="md">Save Changes</modus-button>
|
|
60
|
+
<modus-button color="secondary" size="md">Cancel</modus-button>
|
|
61
|
+
<modus-button color="danger" size="md">Delete</modus-button>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<!-- Status indicators -->
|
|
65
|
+
<div class="flex gap-2">
|
|
66
|
+
<modus-badge color="success">Active</modus-badge>
|
|
67
|
+
<modus-badge color="warning">Pending</modus-badge>
|
|
68
|
+
<modus-badge color="error">Error</modus-badge>
|
|
69
|
+
</div>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Key Rules:**
|
|
73
|
+
|
|
74
|
+
- Same purpose = same variant, same size
|
|
75
|
+
- Use consistent color coding for status indicators
|
|
76
|
+
- Maintain visual hierarchy through consistent styling
|
|
77
|
+
- Group similar interactive elements together
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 3. Law of Common Region
|
|
82
|
+
|
|
83
|
+
**Definition:** Elements that are enclosed within the same boundary are perceived as related or grouped together.
|
|
84
|
+
|
|
85
|
+
**Real-World Example:** In an e-commerce product page, all product details (name, price, description, specifications) are contained within a single card, while customer reviews are in a separate card below. This creates clear visual separation between different types of information.
|
|
86
|
+
|
|
87
|
+
**Implementation:**
|
|
88
|
+
|
|
89
|
+
```html
|
|
90
|
+
<!-- Product details card -->
|
|
91
|
+
<modus-card class="p-6 bg-card border-default rounded-lg">
|
|
92
|
+
<div class="space-y-4">
|
|
93
|
+
<div class="flex items-start justify-between">
|
|
94
|
+
<div class="text-2xl font-bold text-foreground">Product Name</div>
|
|
95
|
+
<div class="text-3xl font-bold text-primary">$99.99</div>
|
|
96
|
+
</div>
|
|
97
|
+
<div class="text-foreground-60">Product description goes here...</div>
|
|
98
|
+
<div class="flex gap-4">
|
|
99
|
+
<modus-button color="primary">Add to Cart</modus-button>
|
|
100
|
+
<modus-button color="secondary">Add to Wishlist</modus-button>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
</modus-card>
|
|
104
|
+
|
|
105
|
+
<!-- Separate reviews card -->
|
|
106
|
+
<modus-card class="p-6 bg-card border-default rounded-lg mt-6">
|
|
107
|
+
<div class="text-xl font-semibold text-foreground mb-4">Customer Reviews</div>
|
|
108
|
+
<!-- Reviews content -->
|
|
109
|
+
</modus-card>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Key Rules:**
|
|
113
|
+
|
|
114
|
+
- Use `modus-card` with `bg-card` and `border-default` for grouping
|
|
115
|
+
- Apply consistent padding (`p-6`) within cards
|
|
116
|
+
- Use `rounded-lg` for visual containment
|
|
117
|
+
- Separate different content types into different cards
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 4. Law of Figure/Ground
|
|
122
|
+
|
|
123
|
+
**Definition:** The visual system automatically separates elements into foreground (figure) and background (ground). The figure appears to stand out from the background.
|
|
124
|
+
|
|
125
|
+
**Real-World Example:** In a modal dialog, the modal content (figure) stands out clearly against the darkened background overlay (ground). The modal appears to "float" above the page content, making it the clear focus of attention.
|
|
126
|
+
|
|
127
|
+
**Implementation:**
|
|
128
|
+
|
|
129
|
+
```html
|
|
130
|
+
<!-- Modal with figure/ground separation -->
|
|
131
|
+
<modus-modal id="confirm-modal" headline="Confirm Action">
|
|
132
|
+
<div slot="content" class="text-foreground-60">
|
|
133
|
+
Are you sure you want to delete this item?
|
|
134
|
+
</div>
|
|
135
|
+
<div slot="footer" class="flex gap-4 justify-end">
|
|
136
|
+
<modus-button color="secondary" (buttonClick)="closeModal()">Cancel</modus-button>
|
|
137
|
+
<modus-button color="danger" (buttonClick)="handleDelete()">Delete</modus-button>
|
|
138
|
+
</div>
|
|
139
|
+
</modus-modal>
|
|
140
|
+
|
|
141
|
+
<!-- Card on background -->
|
|
142
|
+
<div class="bg-background min-h-screen p-6">
|
|
143
|
+
<modus-card class="p-6 bg-card border-default rounded-lg shadow-sm">
|
|
144
|
+
<!-- Card content stands out from background -->
|
|
145
|
+
</modus-card>
|
|
146
|
+
</div>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Key Rules:**
|
|
150
|
+
|
|
151
|
+
- Use `bg-card` over `bg-background` for figure/ground separation
|
|
152
|
+
- Apply shadows (`shadow-sm`, `shadow-lg`) to enhance separation
|
|
153
|
+
- Use borders (`border-default`) to define boundaries
|
|
154
|
+
- Ensure sufficient contrast between figure and ground
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 5. Law of Continuity
|
|
159
|
+
|
|
160
|
+
**Definition:** The eye tends to follow continuous lines, curves, or patterns, creating a sense of flow and direction.
|
|
161
|
+
|
|
162
|
+
**Real-World Example:** In a horizontal navigation menu, the eye naturally follows the line of menu items from left to right. In a form, the eye follows the vertical flow from label to input to the next label-input pair.
|
|
163
|
+
|
|
164
|
+
**Implementation:**
|
|
165
|
+
|
|
166
|
+
```html
|
|
167
|
+
<!-- Horizontal navigation with continuity -->
|
|
168
|
+
<div class="flex items-center gap-8 border-bottom-default pb-4">
|
|
169
|
+
<modus-button variant="borderless">Home</modus-button>
|
|
170
|
+
<modus-button variant="borderless">Products</modus-button>
|
|
171
|
+
<modus-button variant="borderless">About</modus-button>
|
|
172
|
+
<modus-button variant="borderless">Contact</modus-button>
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
<!-- Form with vertical continuity -->
|
|
176
|
+
<div class="space-y-6">
|
|
177
|
+
<div class="flex flex-col gap-2">
|
|
178
|
+
<div class="text-sm font-medium text-foreground">First Name</div>
|
|
179
|
+
<modus-text-input placeholder="Enter first name" />
|
|
180
|
+
</div>
|
|
181
|
+
<div class="flex flex-col gap-2">
|
|
182
|
+
<div class="text-sm font-medium text-foreground">Last Name</div>
|
|
183
|
+
<modus-text-input placeholder="Enter last name" />
|
|
184
|
+
</div>
|
|
185
|
+
<div class="flex flex-col gap-2">
|
|
186
|
+
<div class="text-sm font-medium text-foreground">Email</div>
|
|
187
|
+
<modus-text-input type="email" placeholder="Enter email" />
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Key Rules:**
|
|
193
|
+
|
|
194
|
+
- Maintain alignment using `flex`, `items-start`, `justify-between`
|
|
195
|
+
- Use consistent spacing (`space-y-6`, `gap-2`) for flow
|
|
196
|
+
- Align related elements along common axes
|
|
197
|
+
- Create clear visual paths for the eye to follow
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 6. Hick's Law
|
|
202
|
+
|
|
203
|
+
**Definition:** The time it takes to make a decision increases with the number and complexity of choices available.
|
|
204
|
+
|
|
205
|
+
**Real-World Example:** A toolbar with 15 different buttons creates decision paralysis. Instead, show only the 3 most important actions (Save, Cancel, Delete) and move secondary actions to a dropdown menu or secondary toolbar.
|
|
206
|
+
|
|
207
|
+
**Implementation:**
|
|
208
|
+
|
|
209
|
+
```html
|
|
210
|
+
<!-- Good: Limited primary actions -->
|
|
211
|
+
<div class="flex items-center justify-between gap-4">
|
|
212
|
+
<div class="flex items-center gap-2">
|
|
213
|
+
<i class="modus-icons text-lg">filter_list</i>
|
|
214
|
+
<modus-select placeholder="Filter by" [options]="filterOptions()" />
|
|
215
|
+
</div>
|
|
216
|
+
<div class="flex gap-2">
|
|
217
|
+
<modus-button color="primary">Save</modus-button>
|
|
218
|
+
<modus-button color="secondary">Cancel</modus-button>
|
|
219
|
+
<modus-dropdown-menu [menuVisible]="menuVisible()" (itemSelect)="handleAction($event)">
|
|
220
|
+
<modus-button slot="trigger" variant="borderless" (buttonClick)="toggleMenu()">
|
|
221
|
+
More Actions
|
|
222
|
+
</modus-button>
|
|
223
|
+
<modus-menu-item value="edit">Edit</modus-menu-item>
|
|
224
|
+
<modus-menu-item value="copy">Copy</modus-menu-item>
|
|
225
|
+
<modus-menu-item value="archive">Archive</modus-menu-item>
|
|
226
|
+
</modus-dropdown-menu>
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
229
|
+
|
|
230
|
+
<!-- Bad: Too many choices -->
|
|
231
|
+
<div class="flex gap-2">
|
|
232
|
+
<modus-button color="primary">Save</modus-button>
|
|
233
|
+
<modus-button color="secondary">Cancel</modus-button>
|
|
234
|
+
<modus-button variant="borderless">Edit</modus-button>
|
|
235
|
+
<modus-button variant="borderless">Copy</modus-button>
|
|
236
|
+
<modus-button variant="borderless">Move</modus-button>
|
|
237
|
+
<modus-button variant="borderless">Share</modus-button>
|
|
238
|
+
<modus-button variant="borderless">Archive</modus-button>
|
|
239
|
+
<modus-button color="danger">Delete</modus-button>
|
|
240
|
+
</div>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**Key Rules:**
|
|
244
|
+
|
|
245
|
+
- Maximum 3 visible CTAs per context
|
|
246
|
+
- Move secondary actions to dropdown menus
|
|
247
|
+
- Use progressive disclosure for complex interfaces
|
|
248
|
+
- Prioritize actions by frequency of use
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## 7. Fitts's Law
|
|
253
|
+
|
|
254
|
+
**Definition:** The time required to move to a target is a function of the distance to the target and the size of the target.
|
|
255
|
+
|
|
256
|
+
**Real-World Example:** In a text editor, the "Save" button should be large and positioned near the text area where users are working. A small "Save" button in the top-right corner requires more precision and time to click.
|
|
257
|
+
|
|
258
|
+
**Implementation:**
|
|
259
|
+
|
|
260
|
+
```html
|
|
261
|
+
<!-- Good: Large, accessible buttons near content -->
|
|
262
|
+
<div class="flex flex-col gap-4">
|
|
263
|
+
<modus-textarea
|
|
264
|
+
placeholder="Write your content here..."
|
|
265
|
+
[rows]="6"
|
|
266
|
+
/>
|
|
267
|
+
<div class="flex gap-2">
|
|
268
|
+
<modus-button color="primary" size="lg">Save</modus-button>
|
|
269
|
+
<modus-button color="secondary" size="lg">Cancel</modus-button>
|
|
270
|
+
</div>
|
|
271
|
+
</div>
|
|
272
|
+
|
|
273
|
+
<!-- Good: Floating action button for primary action -->
|
|
274
|
+
<div class="fixed bottom-6 right-6">
|
|
275
|
+
<modus-button
|
|
276
|
+
color="primary"
|
|
277
|
+
size="lg"
|
|
278
|
+
icon="add"
|
|
279
|
+
iconPosition="only"
|
|
280
|
+
ariaLabel="Add new item"
|
|
281
|
+
class="rounded-full shadow-lg"
|
|
282
|
+
/>
|
|
283
|
+
</div>
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**Key Rules:**
|
|
287
|
+
|
|
288
|
+
- Keep primary CTAs near edited content
|
|
289
|
+
- Minimum 44×44px touch targets
|
|
290
|
+
- Use `size="lg"` for important actions
|
|
291
|
+
- Position frequently used controls within easy reach
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## 8. Serial Position Effect
|
|
296
|
+
|
|
297
|
+
**Definition:** Users best remember the first and last items in a series, with the first item having the strongest recall (primacy effect) and the last item having good recall (recency effect).
|
|
298
|
+
|
|
299
|
+
**Real-World Example:** In a navigation menu, place the most important item (like "Dashboard") first, and the least important item (like "Settings") last. In a form, put the most critical field first and the submit button last.
|
|
300
|
+
|
|
301
|
+
**Implementation:**
|
|
302
|
+
|
|
303
|
+
```html
|
|
304
|
+
<!-- Navigation with serial position consideration -->
|
|
305
|
+
<div class="flex flex-col gap-1">
|
|
306
|
+
<modus-button color="primary" class="justify-start">Dashboard</modus-button>
|
|
307
|
+
<modus-button variant="borderless" class="justify-start">Projects</modus-button>
|
|
308
|
+
<modus-button variant="borderless" class="justify-start">Tasks</modus-button>
|
|
309
|
+
<modus-button variant="borderless" class="justify-start">Reports</modus-button>
|
|
310
|
+
<modus-button variant="borderless" class="justify-start">Settings</modus-button>
|
|
311
|
+
</div>
|
|
312
|
+
|
|
313
|
+
<!-- Form with serial position -->
|
|
314
|
+
<div class="space-y-6">
|
|
315
|
+
<div class="flex flex-col gap-2">
|
|
316
|
+
<div class="text-sm font-medium text-foreground">Email *</div>
|
|
317
|
+
<modus-text-input type="email" [required]="true" />
|
|
318
|
+
</div>
|
|
319
|
+
<div class="flex flex-col gap-2">
|
|
320
|
+
<div class="text-sm font-medium text-foreground">Password *</div>
|
|
321
|
+
<modus-text-input type="password" [required]="true" />
|
|
322
|
+
</div>
|
|
323
|
+
<div class="flex flex-col gap-2">
|
|
324
|
+
<div class="text-sm font-medium text-foreground">Confirm Password *</div>
|
|
325
|
+
<modus-text-input type="password" [required]="true" />
|
|
326
|
+
</div>
|
|
327
|
+
<div class="flex gap-4 pt-4">
|
|
328
|
+
<modus-button color="primary" (buttonClick)="createAccount()">Create Account</modus-button>
|
|
329
|
+
<modus-button color="secondary" (buttonClick)="cancel()">Cancel</modus-button>
|
|
330
|
+
</div>
|
|
331
|
+
</div>
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**Key Rules:**
|
|
335
|
+
|
|
336
|
+
- Place primary actions at start or end of flow
|
|
337
|
+
- Put most important information first
|
|
338
|
+
- Position secondary actions in the middle
|
|
339
|
+
- Use visual hierarchy to reinforce importance
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 9. Law of Prägnanz (Simplicity)
|
|
344
|
+
|
|
345
|
+
**Definition:** People tend to perceive the simplest, most stable interpretation of visual elements. The mind prefers simplicity over complexity.
|
|
346
|
+
|
|
347
|
+
**Real-World Example:** A clean, minimal interface with plenty of white space is easier to understand than a cluttered interface with many borders, colors, and decorative elements. Users can focus on the content rather than being distracted by visual noise.
|
|
348
|
+
|
|
349
|
+
**Implementation:**
|
|
350
|
+
|
|
351
|
+
```html
|
|
352
|
+
<!-- Good: Clean, simple design -->
|
|
353
|
+
<div class="bg-background min-h-screen p-6">
|
|
354
|
+
<div class="max-w-4xl mx-auto space-y-8">
|
|
355
|
+
<div class="text-center space-y-4">
|
|
356
|
+
<div class="text-4xl font-bold text-foreground">Welcome</div>
|
|
357
|
+
<div class="text-xl text-foreground-60">Get started with your project</div>
|
|
358
|
+
</div>
|
|
359
|
+
|
|
360
|
+
<modus-card class="p-8 bg-card border-default rounded-lg">
|
|
361
|
+
<div class="space-y-6">
|
|
362
|
+
<div class="text-2xl font-semibold text-foreground">Create New Project</div>
|
|
363
|
+
<div class="space-y-4">
|
|
364
|
+
<modus-text-input placeholder="Project name" />
|
|
365
|
+
<modus-textarea placeholder="Project description" />
|
|
366
|
+
</div>
|
|
367
|
+
<div class="flex gap-4">
|
|
368
|
+
<modus-button color="primary">Create Project</modus-button>
|
|
369
|
+
<modus-button color="secondary">Cancel</modus-button>
|
|
370
|
+
</div>
|
|
371
|
+
</div>
|
|
372
|
+
</modus-card>
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
|
|
376
|
+
<!-- Bad: Cluttered, complex design -->
|
|
377
|
+
<div class="bg-background min-h-screen p-6">
|
|
378
|
+
<div class="max-w-4xl mx-auto space-y-8">
|
|
379
|
+
<div class="text-center space-y-4 border-thick-primary rounded-lg p-6 bg-primary-20">
|
|
380
|
+
<div class="text-4xl font-bold text-foreground">Welcome</div>
|
|
381
|
+
<div class="text-xl text-foreground-60">Get started with your project</div>
|
|
382
|
+
</div>
|
|
383
|
+
|
|
384
|
+
<modus-card class="p-8 bg-card border-thick rounded-lg shadow-lg">
|
|
385
|
+
<div class="space-y-6 border-top-default border-bottom-default py-4">
|
|
386
|
+
<div class="text-2xl font-semibold text-foreground">Create New Project</div>
|
|
387
|
+
<div class="space-y-4">
|
|
388
|
+
<div class="border-default rounded p-2">
|
|
389
|
+
<modus-text-input placeholder="Project name" />
|
|
390
|
+
</div>
|
|
391
|
+
<div class="border-default rounded p-2">
|
|
392
|
+
<modus-textarea placeholder="Project description" />
|
|
393
|
+
</div>
|
|
394
|
+
</div>
|
|
395
|
+
<div class="flex gap-4 border-top-default pt-4">
|
|
396
|
+
<modus-button color="primary">Create Project</modus-button>
|
|
397
|
+
<modus-button color="secondary">Cancel</modus-button>
|
|
398
|
+
</div>
|
|
399
|
+
</div>
|
|
400
|
+
</modus-card>
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**Key Rules:**
|
|
406
|
+
|
|
407
|
+
- Remove unnecessary divs, borders, or text
|
|
408
|
+
- Prefer whitespace over visual elements
|
|
409
|
+
- Use consistent spacing and alignment
|
|
410
|
+
- Focus on content hierarchy over decoration
|
|
411
|
+
- Apply the "less is more" principle
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
## Implementation Checklist
|
|
416
|
+
|
|
417
|
+
When applying Gestalt Laws to your UI design:
|
|
418
|
+
|
|
419
|
+
- [ ] **Proximity**: Group related elements with `gap-2`, separate groups with `gap-6`+
|
|
420
|
+
- [ ] **Similarity**: Use consistent variants and sizes for similar purposes
|
|
421
|
+
- [ ] **Common Region**: Use `modus-card` with `bg-card` and `border-default` for grouping
|
|
422
|
+
- [ ] **Figure/Ground**: Create clear separation with `bg-card` over `bg-background`
|
|
423
|
+
- [ ] **Continuity**: Maintain alignment and flow with consistent spacing
|
|
424
|
+
- [ ] **Hick's Law**: Limit to 3 visible CTAs, use dropdowns for secondary actions
|
|
425
|
+
- [ ] **Fitts's Law**: Keep primary actions near content, use 44×44px minimum targets
|
|
426
|
+
- [ ] **Serial Position**: Place important items first and last
|
|
427
|
+
- [ ] **Prägnanz**: Remove unnecessary elements, prefer whitespace
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
## Real-World Application Examples
|
|
432
|
+
|
|
433
|
+
### E-commerce Product Page
|
|
434
|
+
|
|
435
|
+
- **Proximity**: Product details grouped in one card, reviews in another
|
|
436
|
+
- **Similarity**: All "Add to Cart" buttons use same color
|
|
437
|
+
- **Common Region**: Product info contained within card boundaries
|
|
438
|
+
- **Figure/Ground**: Product card stands out from page background
|
|
439
|
+
- **Continuity**: Eye flows from image to title to price to buttons
|
|
440
|
+
- **Hick's Law**: Primary action (Add to Cart) prominent, secondary actions in dropdown
|
|
441
|
+
- **Fitts's Law**: Large, accessible "Add to Cart" button
|
|
442
|
+
- **Serial Position**: Product name first, price last in header
|
|
443
|
+
- **Prägnanz**: Clean layout with minimal visual noise
|
|
444
|
+
|
|
445
|
+
### Dashboard Interface
|
|
446
|
+
|
|
447
|
+
- **Proximity**: Related metrics grouped together
|
|
448
|
+
- **Similarity**: All status indicators use consistent badge colors
|
|
449
|
+
- **Common Region**: Each widget contained in its own card
|
|
450
|
+
- **Figure/Ground**: Widgets stand out from dashboard background
|
|
451
|
+
- **Continuity**: Consistent grid layout creates visual flow
|
|
452
|
+
- **Hick's Law**: Main actions in toolbar, secondary in menus
|
|
453
|
+
- **Fitts's Law**: Important controls large and accessible
|
|
454
|
+
- **Serial Position**: Most important widget in top-left
|
|
455
|
+
- **Prägnanz**: Clean, uncluttered dashboard design
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
## Angular-Specific Patterns
|
|
460
|
+
|
|
461
|
+
### Signal-Based Component Example
|
|
462
|
+
|
|
463
|
+
```typescript
|
|
464
|
+
@Component({
|
|
465
|
+
selector: 'app-contact-card',
|
|
466
|
+
template: `
|
|
467
|
+
<div class="space-y-6">
|
|
468
|
+
@for (contact of contacts(); track contact.id) {
|
|
469
|
+
<div class="flex items-center gap-2 p-4 bg-card border-default rounded-lg">
|
|
470
|
+
<modus-avatar [name]="contact.name" size="md" />
|
|
471
|
+
<div class="flex flex-col gap-1">
|
|
472
|
+
<div class="text-foreground font-medium">{{ contact.name }}</div>
|
|
473
|
+
<div class="text-foreground-60 text-sm">{{ contact.email }}</div>
|
|
474
|
+
</div>
|
|
475
|
+
<div class="ml-auto">
|
|
476
|
+
<modus-button
|
|
477
|
+
color="primary"
|
|
478
|
+
size="sm"
|
|
479
|
+
(buttonClick)="selectContact(contact)"
|
|
480
|
+
>
|
|
481
|
+
View
|
|
482
|
+
</modus-button>
|
|
483
|
+
</div>
|
|
484
|
+
</div>
|
|
485
|
+
}
|
|
486
|
+
</div>
|
|
487
|
+
`,
|
|
488
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
489
|
+
})
|
|
490
|
+
export class ContactCardComponent {
|
|
491
|
+
readonly contacts = input.required<Contact[]>();
|
|
492
|
+
readonly contactSelected = output<Contact>();
|
|
493
|
+
|
|
494
|
+
selectContact(contact: Contact): void {
|
|
495
|
+
this.contactSelected.emit(contact);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### Using Wrapper Components
|
|
501
|
+
|
|
502
|
+
Always use Modus wrapper components (`modus-button`, `modus-card`, etc.) instead of web components directly:
|
|
503
|
+
|
|
504
|
+
```html
|
|
505
|
+
<!-- Correct: Use Angular wrapper -->
|
|
506
|
+
<modus-button color="primary" (buttonClick)="save()">Save</modus-button>
|
|
507
|
+
|
|
508
|
+
<!-- Wrong: Don't use web component directly -->
|
|
509
|
+
<modus-wc-button color="primary">Save</modus-wc-button>
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
This comprehensive guide provides the foundation for creating intuitive, user-friendly interfaces that follow established principles of visual perception and human-computer interaction in Angular applications.
|