@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.
Files changed (450) hide show
  1. package/README.md +191 -0
  2. package/bin/create-trimble-app.js +9 -0
  3. package/package.json +67 -0
  4. package/src/cli.js +134 -0
  5. package/src/frameworks.js +28 -0
  6. package/src/scaffold.js +209 -0
  7. package/src/utils/file.js +47 -0
  8. package/src/utils/git.js +140 -0
  9. package/src/utils/install.js +25 -0
  10. package/src/utils/logger.js +124 -0
  11. package/templates/angular/.cursor/commands/remove-dev-content.md +394 -0
  12. package/templates/angular/.cursor/mcp.json +13 -0
  13. package/templates/angular/.cursor/rules/modus-angular-20.mdc +82 -0
  14. package/templates/angular/.cursor/rules/modus-angular-accordion-state-management-short.mdc +45 -0
  15. package/templates/angular/.cursor/rules/modus-angular-accordion-state-management.mdc +322 -0
  16. package/templates/angular/.cursor/rules/modus-angular-best-practices.mdc +472 -0
  17. package/templates/angular/.cursor/rules/modus-angular-border-usage-short.mdc +48 -0
  18. package/templates/angular/.cursor/rules/modus-angular-border-usage.mdc +286 -0
  19. package/templates/angular/.cursor/rules/modus-angular-button-group-usage-short.mdc +47 -0
  20. package/templates/angular/.cursor/rules/modus-angular-button-group-usage.mdc +263 -0
  21. package/templates/angular/.cursor/rules/modus-angular-checkbox-value-inversion-short.mdc +36 -0
  22. package/templates/angular/.cursor/rules/modus-angular-checkbox-value-inversion.mdc +92 -0
  23. package/templates/angular/.cursor/rules/modus-angular-chrome-devtools-testing-short.mdc +34 -0
  24. package/templates/angular/.cursor/rules/modus-angular-chrome-devtools-testing.mdc +185 -0
  25. package/templates/angular/.cursor/rules/modus-angular-color-usage-short.mdc +56 -0
  26. package/templates/angular/.cursor/rules/modus-angular-color-usage.mdc +208 -0
  27. package/templates/angular/.cursor/rules/modus-angular-components-reference.mdc +114 -0
  28. package/templates/angular/.cursor/rules/modus-angular-design-system.mdc +273 -0
  29. package/templates/angular/.cursor/rules/modus-angular-development-workflow-short.mdc +43 -0
  30. package/templates/angular/.cursor/rules/modus-angular-development-workflow.mdc +145 -0
  31. package/templates/angular/.cursor/rules/modus-angular-essentials.mdc +272 -0
  32. package/templates/angular/.cursor/rules/modus-angular-forms-validation-short.mdc +56 -0
  33. package/templates/angular/.cursor/rules/modus-angular-forms-validation.mdc +124 -0
  34. package/templates/angular/.cursor/rules/modus-angular-icon-names.mdc +70 -0
  35. package/templates/angular/.cursor/rules/modus-angular-icons-short.mdc +40 -0
  36. package/templates/angular/.cursor/rules/modus-angular-icons.mdc +137 -0
  37. package/templates/angular/.cursor/rules/modus-angular-implementation-guides-short.mdc +36 -0
  38. package/templates/angular/.cursor/rules/modus-angular-implementation-guides.mdc +301 -0
  39. package/templates/angular/.cursor/rules/modus-angular-integration-short.mdc +60 -0
  40. package/templates/angular/.cursor/rules/modus-angular-integration.mdc +1096 -0
  41. package/templates/angular/.cursor/rules/modus-angular-master.mdc +164 -0
  42. package/templates/angular/.cursor/rules/modus-angular-modal-usage-short.mdc +51 -0
  43. package/templates/angular/.cursor/rules/modus-angular-modal-usage.mdc +115 -0
  44. package/templates/angular/.cursor/rules/modus-angular-navbar-usage-short.mdc +49 -0
  45. package/templates/angular/.cursor/rules/modus-angular-navbar-usage.mdc +146 -0
  46. package/templates/angular/.cursor/rules/modus-angular-no-emojis.mdc +66 -0
  47. package/templates/angular/.cursor/rules/modus-angular-opacity-utilities-short.mdc +43 -0
  48. package/templates/angular/.cursor/rules/modus-angular-opacity-utilities.mdc +160 -0
  49. package/templates/angular/.cursor/rules/modus-angular-select-vs-dropdown-menu-short.mdc +51 -0
  50. package/templates/angular/.cursor/rules/modus-angular-select-vs-dropdown-menu.mdc +83 -0
  51. package/templates/angular/.cursor/rules/modus-angular-semantic-html-short.mdc +36 -0
  52. package/templates/angular/.cursor/rules/modus-angular-semantic-html.mdc +81 -0
  53. package/templates/angular/.cursor/rules/modus-angular-side-navigation-usage-short.mdc +50 -0
  54. package/templates/angular/.cursor/rules/modus-angular-side-navigation-usage.mdc +136 -0
  55. package/templates/angular/.cursor/rules/modus-angular-table-usage-short.mdc +52 -0
  56. package/templates/angular/.cursor/rules/modus-angular-table-usage.mdc +151 -0
  57. package/templates/angular/.cursor/rules/modus-angular-tailwind-usage-short.mdc +44 -0
  58. package/templates/angular/.cursor/rules/modus-angular-tailwind-usage.mdc +242 -0
  59. package/templates/angular/.cursor/rules/modus-angular-themes-short.mdc +54 -0
  60. package/templates/angular/.cursor/rules/modus-angular-themes.mdc +222 -0
  61. package/templates/angular/.cursor/rules/modus-angular-utility-panel-usage-short.mdc +52 -0
  62. package/templates/angular/.cursor/rules/modus-angular-utility-panel-usage.mdc +130 -0
  63. package/templates/angular/.cursor/rules/ux/gestalt-laws-detailed.mdc +514 -0
  64. package/templates/angular/.cursor/rules/ux/ux-ui-foundations.mdc +235 -0
  65. package/templates/angular/.cursor/skills/run-lint-checks/SKILL.md +169 -0
  66. package/templates/angular/.editorconfig +17 -0
  67. package/templates/angular/.github/dependabot.yml +19 -0
  68. package/templates/angular/.github/workflows/a11y-check.yml +135 -0
  69. package/templates/angular/.github/workflows/ci.yml +44 -0
  70. package/templates/angular/.husky/pre-commit +32 -0
  71. package/templates/angular/.postcssrc.json +5 -0
  72. package/templates/angular/.vscode/extensions.json +4 -0
  73. package/templates/angular/.vscode/launch.json +20 -0
  74. package/templates/angular/.vscode/tasks.json +42 -0
  75. package/templates/angular/CLAUDE.md +148 -0
  76. package/templates/angular/README.md +92 -0
  77. package/templates/angular/amplify.yml +25 -0
  78. package/templates/angular/angular.json +106 -0
  79. package/templates/angular/data/modusIcons.ts +861 -0
  80. package/templates/angular/package-lock.json +11030 -0
  81. package/templates/angular/package.json +66 -0
  82. package/templates/angular/public/angular-icon.svg +12 -0
  83. package/templates/angular/public/favicon.ico +0 -0
  84. package/templates/angular/public/modus-icons.css +49 -0
  85. package/templates/angular/public/vite.svg +1 -0
  86. package/templates/angular/scripts/README.md +410 -0
  87. package/templates/angular/scripts/check-border-violations.js +352 -0
  88. package/templates/angular/scripts/check-icon-names.js +402 -0
  89. package/templates/angular/scripts/check-inline-styles.js +292 -0
  90. package/templates/angular/scripts/check-modus-colors.js +282 -0
  91. package/templates/angular/scripts/check-modus-icons.js +263 -0
  92. package/templates/angular/scripts/check-opacity-utilities.js +426 -0
  93. package/templates/angular/scripts/check-semantic-html.js +452 -0
  94. package/templates/angular/scripts/check-typescript.js +109 -0
  95. package/templates/angular/src/app/app.config.ts +29 -0
  96. package/templates/angular/src/app/app.css +0 -0
  97. package/templates/angular/src/app/app.html +4 -0
  98. package/templates/angular/src/app/app.routes.ts +351 -0
  99. package/templates/angular/src/app/app.spec.ts +27 -0
  100. package/templates/angular/src/app/app.ts +47 -0
  101. package/templates/angular/src/app/components/README.md +77 -0
  102. package/templates/angular/src/app/components/index.ts +53 -0
  103. package/templates/angular/src/app/components/modus-accordion.component.ts +50 -0
  104. package/templates/angular/src/app/components/modus-alert.component.ts +133 -0
  105. package/templates/angular/src/app/components/modus-autocomplete.component.ts +262 -0
  106. package/templates/angular/src/app/components/modus-avatar.component.ts +75 -0
  107. package/templates/angular/src/app/components/modus-badge.component.ts +84 -0
  108. package/templates/angular/src/app/components/modus-breadcrumbs.component.ts +65 -0
  109. package/templates/angular/src/app/components/modus-button-group.component.ts +82 -0
  110. package/templates/angular/src/app/components/modus-button.component.ts +292 -0
  111. package/templates/angular/src/app/components/modus-card.component.ts +73 -0
  112. package/templates/angular/src/app/components/modus-checkbox.component.ts +117 -0
  113. package/templates/angular/src/app/components/modus-chip.component.ts +97 -0
  114. package/templates/angular/src/app/components/modus-collapse.component.ts +118 -0
  115. package/templates/angular/src/app/components/modus-date.component.ts +165 -0
  116. package/templates/angular/src/app/components/modus-dropdown-menu.component.ts +108 -0
  117. package/templates/angular/src/app/components/modus-file-dropzone.component.ts +121 -0
  118. package/templates/angular/src/app/components/modus-handle.component.ts +96 -0
  119. package/templates/angular/src/app/components/modus-icon.component.ts +81 -0
  120. package/templates/angular/src/app/components/modus-input-feedback.component.ts +54 -0
  121. package/templates/angular/src/app/components/modus-input-label.component.ts +62 -0
  122. package/templates/angular/src/app/components/modus-loader.component.ts +48 -0
  123. package/templates/angular/src/app/components/modus-logo.component.ts +115 -0
  124. package/templates/angular/src/app/components/modus-menu-item.component.ts +116 -0
  125. package/templates/angular/src/app/components/modus-menu.component.ts +58 -0
  126. package/templates/angular/src/app/components/modus-modal.component.ts +70 -0
  127. package/templates/angular/src/app/components/modus-navbar.component.ts +303 -0
  128. package/templates/angular/src/app/components/modus-number-input.component.ts +174 -0
  129. package/templates/angular/src/app/components/modus-pagination.component.ts +74 -0
  130. package/templates/angular/src/app/components/modus-panel.component.ts +61 -0
  131. package/templates/angular/src/app/components/modus-progress.component.ts +62 -0
  132. package/templates/angular/src/app/components/modus-radio.component.ts +102 -0
  133. package/templates/angular/src/app/components/modus-rating.component.ts +80 -0
  134. package/templates/angular/src/app/components/modus-select.component.ts +131 -0
  135. package/templates/angular/src/app/components/modus-side-navigation.component.ts +90 -0
  136. package/templates/angular/src/app/components/modus-skeleton.component.ts +54 -0
  137. package/templates/angular/src/app/components/modus-slider.component.ts +132 -0
  138. package/templates/angular/src/app/components/modus-stepper.component.ts +65 -0
  139. package/templates/angular/src/app/components/modus-switch.component.ts +118 -0
  140. package/templates/angular/src/app/components/modus-table.component.ts +204 -0
  141. package/templates/angular/src/app/components/modus-tabs.component.ts +82 -0
  142. package/templates/angular/src/app/components/modus-text-input.component.ts +221 -0
  143. package/templates/angular/src/app/components/modus-textarea.component.ts +168 -0
  144. package/templates/angular/src/app/components/modus-theme-switcher.component.ts +45 -0
  145. package/templates/angular/src/app/components/modus-time-input.component.ts +172 -0
  146. package/templates/angular/src/app/components/modus-toast.component.ts +63 -0
  147. package/templates/angular/src/app/components/modus-toolbar.component.ts +43 -0
  148. package/templates/angular/src/app/components/modus-tooltip.component.ts +83 -0
  149. package/templates/angular/src/app/components/modus-typography.component.ts +79 -0
  150. package/templates/angular/src/app/components/modus-utility-panel.component.ts +275 -0
  151. package/templates/angular/src/app/components/theme-demo.component.ts +1242 -0
  152. package/templates/angular/src/app/data/component-demos.ts +360 -0
  153. package/templates/angular/src/app/data/modus-icons.ts +806 -0
  154. package/templates/angular/src/app/demos/accordion/accordion-demo.component.ts +212 -0
  155. package/templates/angular/src/app/demos/alert/alert-demo.component.ts +108 -0
  156. package/templates/angular/src/app/demos/autocomplete/autocomplete-demo.component.ts +174 -0
  157. package/templates/angular/src/app/demos/avatar/avatar-demo.component.ts +149 -0
  158. package/templates/angular/src/app/demos/badge/badge-demo.component.ts +148 -0
  159. package/templates/angular/src/app/demos/breadcrumbs/breadcrumbs-demo.component.ts +96 -0
  160. package/templates/angular/src/app/demos/button/button-demo.component.ts +256 -0
  161. package/templates/angular/src/app/demos/button-group/button-group-demo.component.ts +215 -0
  162. package/templates/angular/src/app/demos/card/card-demo.component.ts +180 -0
  163. package/templates/angular/src/app/demos/checkbox/checkbox-demo.component.ts +71 -0
  164. package/templates/angular/src/app/demos/chip/chip-demo.component.ts +183 -0
  165. package/templates/angular/src/app/demos/date/date-demo.component.ts +193 -0
  166. package/templates/angular/src/app/demos/dropdown/dropdown-demo.component.ts +196 -0
  167. package/templates/angular/src/app/demos/file-dropzone/file-dropzone-demo.component.ts +176 -0
  168. package/templates/angular/src/app/demos/handle/handle-demo.component.ts +265 -0
  169. package/templates/angular/src/app/demos/icon/icon-demo.component.ts +65 -0
  170. package/templates/angular/src/app/demos/input-feedback/input-feedback-demo.component.ts +189 -0
  171. package/templates/angular/src/app/demos/input-label/input-label-demo.component.ts +330 -0
  172. package/templates/angular/src/app/demos/loader/loader-demo.component.ts +143 -0
  173. package/templates/angular/src/app/demos/logo/logo-demo.component.ts +191 -0
  174. package/templates/angular/src/app/demos/menu/menu-demo.component.ts +72 -0
  175. package/templates/angular/src/app/demos/modal/modal-demo.component.ts +278 -0
  176. package/templates/angular/src/app/demos/navbar/navbar-demo.component.ts +135 -0
  177. package/templates/angular/src/app/demos/number-input/number-input-demo.component.ts +175 -0
  178. package/templates/angular/src/app/demos/pagination/pagination-demo.component.ts +134 -0
  179. package/templates/angular/src/app/demos/panel/panel-demo.component.ts +235 -0
  180. package/templates/angular/src/app/demos/progress/progress-demo.component.ts +169 -0
  181. package/templates/angular/src/app/demos/radio/radio-demo.component.ts +161 -0
  182. package/templates/angular/src/app/demos/rating/rating-demo.component.ts +97 -0
  183. package/templates/angular/src/app/demos/select/select-demo.component.ts +107 -0
  184. package/templates/angular/src/app/demos/shared/demo-example-clean.component.ts +41 -0
  185. package/templates/angular/src/app/demos/shared/demo-example.component.ts +42 -0
  186. package/templates/angular/src/app/demos/shared/demo-page.component.ts +97 -0
  187. package/templates/angular/src/app/demos/shared/index.ts +3 -0
  188. package/templates/angular/src/app/demos/side-navigation/side-navigation-demo.component.ts +524 -0
  189. package/templates/angular/src/app/demos/skeleton/skeleton-demo.component.ts +112 -0
  190. package/templates/angular/src/app/demos/slider/slider-demo.component.ts +76 -0
  191. package/templates/angular/src/app/demos/stepper/stepper-demo.component.ts +79 -0
  192. package/templates/angular/src/app/demos/switch/switch-demo.component.ts +113 -0
  193. package/templates/angular/src/app/demos/table/table-demo.component.ts +405 -0
  194. package/templates/angular/src/app/demos/tabs/tabs-demo.component.ts +318 -0
  195. package/templates/angular/src/app/demos/text-input/text-input-demo.component.ts +160 -0
  196. package/templates/angular/src/app/demos/textarea/textarea-demo.component.ts +95 -0
  197. package/templates/angular/src/app/demos/theme-switcher/theme-switcher-demo.component.ts +38 -0
  198. package/templates/angular/src/app/demos/time-input/time-input-demo.component.ts +130 -0
  199. package/templates/angular/src/app/demos/toast/toast-demo.component.ts +258 -0
  200. package/templates/angular/src/app/demos/toolbar/toolbar-demo.component.ts +54 -0
  201. package/templates/angular/src/app/demos/tooltip/tooltip-demo.component.ts +163 -0
  202. package/templates/angular/src/app/demos/utility-panel/utility-panel-demo.component.ts +197 -0
  203. package/templates/angular/src/app/dev/dev-config.ts +119 -0
  204. package/templates/angular/src/app/dev/dev-panel/dev-panel.component.ts +215 -0
  205. package/templates/angular/src/app/dev/dev-panel.service.ts +63 -0
  206. package/templates/angular/src/app/dev/index.ts +8 -0
  207. package/templates/angular/src/app/dev/theme-switcher-dropdown/theme-switcher-dropdown.component.ts +134 -0
  208. package/templates/angular/src/app/dev-pages/color-palette/color-palette.component.ts +229 -0
  209. package/templates/angular/src/app/dev-pages/components-gallery/components-gallery.component.ts +486 -0
  210. package/templates/angular/src/app/dev-pages/icons/icons.component.ts +149 -0
  211. package/templates/angular/src/app/pages/home/home.component.ts +251 -0
  212. package/templates/angular/src/app/services/README.md +57 -0
  213. package/templates/angular/src/app/services/theme.service.ts +163 -0
  214. package/templates/angular/src/environments/environment.development.ts +8 -0
  215. package/templates/angular/src/environments/environment.ts +8 -0
  216. package/templates/angular/src/index.html +14 -0
  217. package/templates/angular/src/main.ts +6 -0
  218. package/templates/angular/src/styles.css +1328 -0
  219. package/templates/angular/tsconfig.app.json +15 -0
  220. package/templates/angular/tsconfig.json +35 -0
  221. package/templates/angular/tsconfig.spec.json +14 -0
  222. package/templates/config.json +23 -0
  223. package/templates/react/.cursor/commands/remove-dev-content.md +311 -0
  224. package/templates/react/.cursor/mcp.json +13 -0
  225. package/templates/react/.cursor/rules/README.md +240 -0
  226. package/templates/react/.cursor/rules/border-usage-guidelines-short.mdc +22 -0
  227. package/templates/react/.cursor/rules/border-usage-guidelines.mdc +380 -0
  228. package/templates/react/.cursor/rules/chrome-devtools-testing-react-short.mdc +23 -0
  229. package/templates/react/.cursor/rules/development-workflow-react-short.mdc +23 -0
  230. package/templates/react/.cursor/rules/development-workflow-react.mdc +292 -0
  231. package/templates/react/.cursor/rules/implementation-guides-react-short.mdc +23 -0
  232. package/templates/react/.cursor/rules/implementation-guides-react.mdc +446 -0
  233. package/templates/react/.cursor/rules/modus-accordion-state-management-react-short.mdc +23 -0
  234. package/templates/react/.cursor/rules/modus-accordion-state-management-react.mdc +445 -0
  235. package/templates/react/.cursor/rules/modus-button-group-usage-react-short.mdc +23 -0
  236. package/templates/react/.cursor/rules/modus-button-group-usage-react.mdc +117 -0
  237. package/templates/react/.cursor/rules/modus-checkbox-value-inversion-react-short.mdc +23 -0
  238. package/templates/react/.cursor/rules/modus-checkbox-value-inversion-react.mdc +492 -0
  239. package/templates/react/.cursor/rules/modus-color-usage-react-short.mdc +23 -0
  240. package/templates/react/.cursor/rules/modus-color-usage-react.mdc +420 -0
  241. package/templates/react/.cursor/rules/modus-components-reference.mdc +366 -0
  242. package/templates/react/.cursor/rules/modus-icon-names.mdc +63 -0
  243. package/templates/react/.cursor/rules/modus-icons-react-short.mdc +24 -0
  244. package/templates/react/.cursor/rules/modus-icons-react.mdc +402 -0
  245. package/templates/react/.cursor/rules/modus-modal-implementation-react-short.mdc +23 -0
  246. package/templates/react/.cursor/rules/modus-modal-implementation-react.mdc +831 -0
  247. package/templates/react/.cursor/rules/modus-navbar-side-navigation-react-short.mdc +23 -0
  248. package/templates/react/.cursor/rules/modus-navbar-side-navigation-react.mdc +247 -0
  249. package/templates/react/.cursor/rules/modus-no-emojis-react-short.mdc +23 -0
  250. package/templates/react/.cursor/rules/modus-opacity-utilities-react-short.mdc +70 -0
  251. package/templates/react/.cursor/rules/modus-opacity-utilities-react.mdc +208 -0
  252. package/templates/react/.cursor/rules/modus-react-best-practices-short.mdc +23 -0
  253. package/templates/react/.cursor/rules/modus-react-best-practices.mdc +508 -0
  254. package/templates/react/.cursor/rules/modus-react-essentials.mdc +209 -0
  255. package/templates/react/.cursor/rules/modus-react-integration-short.mdc +23 -0
  256. package/templates/react/.cursor/rules/modus-react-integration.mdc +509 -0
  257. package/templates/react/.cursor/rules/modus-react-key-warnings-short.mdc +23 -0
  258. package/templates/react/.cursor/rules/modus-react-key-warnings.mdc +805 -0
  259. package/templates/react/.cursor/rules/modus-react-master.mdc +160 -0
  260. package/templates/react/.cursor/rules/modus-select-vs-dropdown-menu-react-short.mdc +23 -0
  261. package/templates/react/.cursor/rules/modus-select-vs-dropdown-menu-react.mdc +442 -0
  262. package/templates/react/.cursor/rules/modus-semantic-html-react-short.mdc +23 -0
  263. package/templates/react/.cursor/rules/modus-semantic-html-react.mdc +427 -0
  264. package/templates/react/.cursor/rules/modus-tailwind-usage-react-short.mdc +23 -0
  265. package/templates/react/.cursor/rules/modus-tailwind-usage-react.mdc +642 -0
  266. package/templates/react/.cursor/rules/modus-themes-react-short.mdc +23 -0
  267. package/templates/react/.cursor/rules/modus-themes-react.mdc +506 -0
  268. package/templates/react/.cursor/rules/ux/gestalt-laws-detailed.mdc +456 -0
  269. package/templates/react/.cursor/rules/ux/ux-ui-foundations.mdc +211 -0
  270. package/templates/react/.cursor/skills/create-modus-form-component/SKILL.md +518 -0
  271. package/templates/react/.cursor/skills/create-modus-wrapper-component/SKILL.md +252 -0
  272. package/templates/react/.cursor/skills/fix-modus-component-event-issues/SKILL.md +345 -0
  273. package/templates/react/.cursor/skills/handle-modus-checkbox-value-bug/SKILL.md +202 -0
  274. package/templates/react/.cursor/skills/implement-modus-modal-with-refs/SKILL.md +386 -0
  275. package/templates/react/.cursor/skills/integrate-modus-icons/SKILL.md +300 -0
  276. package/templates/react/.cursor/skills/run-lint-checks/SKILL.md +235 -0
  277. package/templates/react/.cursor/skills/set-up-modus-event-listeners/SKILL.md +284 -0
  278. package/templates/react/.cursor/skills/style-modus-components-with-tailwind/SKILL.md +382 -0
  279. package/templates/react/.env.development +3 -0
  280. package/templates/react/.env.production +3 -0
  281. package/templates/react/.github/CODEOWNERS +28 -0
  282. package/templates/react/.github/ISSUE_TEMPLATE/bug_report.yml +176 -0
  283. package/templates/react/.github/ISSUE_TEMPLATE/config.yml +20 -0
  284. package/templates/react/.github/ISSUE_TEMPLATE/documentation.yml +115 -0
  285. package/templates/react/.github/ISSUE_TEMPLATE/feature_request.yml +171 -0
  286. package/templates/react/.github/ISSUE_TEMPLATE/question.yml +139 -0
  287. package/templates/react/.github/copilot-instructions.md +80 -0
  288. package/templates/react/.github/instructions/components.instructions.md +82 -0
  289. package/templates/react/.github/instructions/demos.instructions.md +82 -0
  290. package/templates/react/.github/instructions/pages.instructions.md +76 -0
  291. package/templates/react/.github/instructions/styles.instructions.md +77 -0
  292. package/templates/react/.github/instructions/typescript.instructions.md +101 -0
  293. package/templates/react/.github/pull_request_template.md +188 -0
  294. package/templates/react/.github/workflows/ci.yml +43 -0
  295. package/templates/react/.github/workflows/claude-code-review.yml +44 -0
  296. package/templates/react/.github/workflows/claude.yml +50 -0
  297. package/templates/react/.husky/pre-commit +28 -0
  298. package/templates/react/.vscode/extensions.json +8 -0
  299. package/templates/react/CLAUDE.md +119 -0
  300. package/templates/react/CODE_OF_CONDUCT.md +79 -0
  301. package/templates/react/CONTRIBUTING.md +65 -0
  302. package/templates/react/LICENSE +21 -0
  303. package/templates/react/README.md +728 -0
  304. package/templates/react/SECURITY.md +50 -0
  305. package/templates/react/eslint.config.js +23 -0
  306. package/templates/react/index.html +13 -0
  307. package/templates/react/package-lock.json +5209 -0
  308. package/templates/react/package.json +49 -0
  309. package/templates/react/postcss.config.js +6 -0
  310. package/templates/react/public/react.svg +1 -0
  311. package/templates/react/public/vite.svg +1 -0
  312. package/templates/react/readme_assets/getting_started_header.png +0 -0
  313. package/templates/react/readme_assets/hero.png +0 -0
  314. package/templates/react/readme_assets/modus_comp.png +0 -0
  315. package/templates/react/readme_assets/modus_figma_mcp.png +0 -0
  316. package/templates/react/readme_assets/teaser_comp.gif +0 -0
  317. package/templates/react/scripts/README.md +343 -0
  318. package/templates/react/scripts/check-border-violations.js +483 -0
  319. package/templates/react/scripts/check-icon-names.js +486 -0
  320. package/templates/react/scripts/check-inline-styles.js +364 -0
  321. package/templates/react/scripts/check-modus-colors.js +247 -0
  322. package/templates/react/scripts/check-modus-icons.js +256 -0
  323. package/templates/react/scripts/check-opacity-utilities.js +481 -0
  324. package/templates/react/scripts/check-semantic-html.js +476 -0
  325. package/templates/react/scripts/check-typescript.js +109 -0
  326. package/templates/react/src/App.css +42 -0
  327. package/templates/react/src/App.tsx +54 -0
  328. package/templates/react/src/assets/react.svg +1 -0
  329. package/templates/react/src/components/DemoExample.tsx +61 -0
  330. package/templates/react/src/components/DemoPage.tsx +81 -0
  331. package/templates/react/src/components/ModusAccordion.tsx +89 -0
  332. package/templates/react/src/components/ModusAlert.tsx +85 -0
  333. package/templates/react/src/components/ModusAutocomplete.tsx +207 -0
  334. package/templates/react/src/components/ModusAvatar.tsx +50 -0
  335. package/templates/react/src/components/ModusBadge.tsx +82 -0
  336. package/templates/react/src/components/ModusBreadcrumbs.tsx +75 -0
  337. package/templates/react/src/components/ModusButton.tsx +244 -0
  338. package/templates/react/src/components/ModusButtonGroup.tsx +91 -0
  339. package/templates/react/src/components/ModusCard.tsx +70 -0
  340. package/templates/react/src/components/ModusCheckbox.tsx +168 -0
  341. package/templates/react/src/components/ModusChip.tsx +93 -0
  342. package/templates/react/src/components/ModusDate.tsx +154 -0
  343. package/templates/react/src/components/ModusDropdownMenu.tsx +148 -0
  344. package/templates/react/src/components/ModusFileDropzone.tsx +140 -0
  345. package/templates/react/src/components/ModusHandle.tsx +101 -0
  346. package/templates/react/src/components/ModusIcon.tsx +49 -0
  347. package/templates/react/src/components/ModusInputFeedback.tsx +52 -0
  348. package/templates/react/src/components/ModusInputLabel.tsx +50 -0
  349. package/templates/react/src/components/ModusLoader.tsx +42 -0
  350. package/templates/react/src/components/ModusLogo.tsx +102 -0
  351. package/templates/react/src/components/ModusMenu.tsx +119 -0
  352. package/templates/react/src/components/ModusMenuItem.tsx +86 -0
  353. package/templates/react/src/components/ModusModal.tsx +145 -0
  354. package/templates/react/src/components/ModusNavbar.tsx +504 -0
  355. package/templates/react/src/components/ModusNumberInput.tsx +230 -0
  356. package/templates/react/src/components/ModusPagination.tsx +94 -0
  357. package/templates/react/src/components/ModusPanel.tsx +92 -0
  358. package/templates/react/src/components/ModusProgress.tsx +70 -0
  359. package/templates/react/src/components/ModusProvider.tsx +18 -0
  360. package/templates/react/src/components/ModusRadio.tsx +114 -0
  361. package/templates/react/src/components/ModusRating.tsx +108 -0
  362. package/templates/react/src/components/ModusSelect.tsx +171 -0
  363. package/templates/react/src/components/ModusSideNavigation.tsx +149 -0
  364. package/templates/react/src/components/ModusSkeleton.tsx +42 -0
  365. package/templates/react/src/components/ModusSlider.tsx +128 -0
  366. package/templates/react/src/components/ModusStepper.tsx +85 -0
  367. package/templates/react/src/components/ModusSwitch.tsx +130 -0
  368. package/templates/react/src/components/ModusTable.tsx +309 -0
  369. package/templates/react/src/components/ModusTabs.tsx +114 -0
  370. package/templates/react/src/components/ModusTextInput.tsx +179 -0
  371. package/templates/react/src/components/ModusTextarea.tsx +164 -0
  372. package/templates/react/src/components/ModusThemeSwitcher.tsx +58 -0
  373. package/templates/react/src/components/ModusTimeInput.tsx +176 -0
  374. package/templates/react/src/components/ModusToast.tsx +207 -0
  375. package/templates/react/src/components/ModusToolbar.tsx +70 -0
  376. package/templates/react/src/components/ModusTooltip.tsx +97 -0
  377. package/templates/react/src/components/ModusUtilityPanel.tsx +198 -0
  378. package/templates/react/src/components/ThemeSwitcherDropdown.tsx +117 -0
  379. package/templates/react/src/components/ThemeToggleSimple.tsx +157 -0
  380. package/templates/react/src/config/routes.ts +196 -0
  381. package/templates/react/src/contexts/ThemeContext.tsx +81 -0
  382. package/templates/react/src/contexts/ThemeContextData.tsx +89 -0
  383. package/templates/react/src/data/modusIcons.ts +865 -0
  384. package/templates/react/src/demos/accordion-demo/page.tsx +236 -0
  385. package/templates/react/src/demos/alert-demo/page.tsx +94 -0
  386. package/templates/react/src/demos/autocomplete-demo/page.tsx +166 -0
  387. package/templates/react/src/demos/avatar-demo/page.tsx +135 -0
  388. package/templates/react/src/demos/badge-demo/page.tsx +174 -0
  389. package/templates/react/src/demos/breadcrumbs-demo/page.tsx +88 -0
  390. package/templates/react/src/demos/button-demo/page.tsx +261 -0
  391. package/templates/react/src/demos/button-group-demo/page.tsx +231 -0
  392. package/templates/react/src/demos/card-demo/page.tsx +241 -0
  393. package/templates/react/src/demos/checkbox-demo/page.tsx +79 -0
  394. package/templates/react/src/demos/chip-demo/page.tsx +197 -0
  395. package/templates/react/src/demos/date-demo/page.tsx +179 -0
  396. package/templates/react/src/demos/dropdown-demo/page.tsx +150 -0
  397. package/templates/react/src/demos/file-dropzone-demo/page.tsx +186 -0
  398. package/templates/react/src/demos/handle-demo/page.tsx +313 -0
  399. package/templates/react/src/demos/icon-demo/page.tsx +72 -0
  400. package/templates/react/src/demos/input-feedback-demo/page.tsx +202 -0
  401. package/templates/react/src/demos/input-label-demo/page.tsx +392 -0
  402. package/templates/react/src/demos/loader-demo/page.tsx +138 -0
  403. package/templates/react/src/demos/logo-demo/page.tsx +292 -0
  404. package/templates/react/src/demos/menu-demo/page.tsx +70 -0
  405. package/templates/react/src/demos/modal-demo/page.tsx +332 -0
  406. package/templates/react/src/demos/navbar-demo/page.tsx +141 -0
  407. package/templates/react/src/demos/number-input-demo/page.tsx +180 -0
  408. package/templates/react/src/demos/pagination-demo/page.tsx +147 -0
  409. package/templates/react/src/demos/panel-demo/page.tsx +376 -0
  410. package/templates/react/src/demos/progress-demo/page.tsx +185 -0
  411. package/templates/react/src/demos/radio-demo/page.tsx +242 -0
  412. package/templates/react/src/demos/rating-demo/page.tsx +97 -0
  413. package/templates/react/src/demos/select-demo/page.tsx +111 -0
  414. package/templates/react/src/demos/side-navigation-demo/page.tsx +775 -0
  415. package/templates/react/src/demos/skeleton-demo/page.tsx +107 -0
  416. package/templates/react/src/demos/slider-demo/page.tsx +78 -0
  417. package/templates/react/src/demos/stepper-demo/page.tsx +86 -0
  418. package/templates/react/src/demos/switch-demo/page.tsx +146 -0
  419. package/templates/react/src/demos/table-demo/page.tsx +489 -0
  420. package/templates/react/src/demos/tabs-demo/page.tsx +187 -0
  421. package/templates/react/src/demos/text-input-demo/page.tsx +151 -0
  422. package/templates/react/src/demos/textarea-demo/page.tsx +73 -0
  423. package/templates/react/src/demos/theme-switcher-demo/page.tsx +26 -0
  424. package/templates/react/src/demos/time-input-demo/page.tsx +148 -0
  425. package/templates/react/src/demos/toast-demo/page.tsx +302 -0
  426. package/templates/react/src/demos/toolbar-demo/page.tsx +49 -0
  427. package/templates/react/src/demos/tooltip-demo/page.tsx +209 -0
  428. package/templates/react/src/demos/typography-test/page.tsx +28 -0
  429. package/templates/react/src/demos/utility-panel-demo/page.tsx +197 -0
  430. package/templates/react/src/dev/DevPanel.tsx +219 -0
  431. package/templates/react/src/dev/DevPanelContext.ts +14 -0
  432. package/templates/react/src/dev/DevPanelProvider.tsx +63 -0
  433. package/templates/react/src/dev/DevRoutes.tsx +98 -0
  434. package/templates/react/src/dev/config.ts +127 -0
  435. package/templates/react/src/dev/index.ts +8 -0
  436. package/templates/react/src/dev/useDevPanel.ts +17 -0
  437. package/templates/react/src/dev-pages/ColorPalettePage.tsx +347 -0
  438. package/templates/react/src/dev-pages/ComponentsGalleryPage.tsx +489 -0
  439. package/templates/react/src/dev-pages/IconsPage.tsx +137 -0
  440. package/templates/react/src/dev-pages/index.ts +3 -0
  441. package/templates/react/src/hooks/useTheme.ts +15 -0
  442. package/templates/react/src/index.css +635 -0
  443. package/templates/react/src/main.tsx +14 -0
  444. package/templates/react/src/pages/HomePage.tsx +283 -0
  445. package/templates/react/src/vite-env.d.ts +9 -0
  446. package/templates/react/tailwind.config.js +58 -0
  447. package/templates/react/tsconfig.app.json +27 -0
  448. package/templates/react/tsconfig.json +7 -0
  449. package/templates/react/tsconfig.node.json +25 -0
  450. 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.