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