@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,509 @@
1
+ ---
2
+ description: Essential integration patterns for Modus Web Components with React + Vite
3
+ globs: ["**/*.tsx", "**/*.ts"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Modus Web Components Integration with React + Vite
8
+
9
+ ## 🏗️ **Architecture Overview**
10
+
11
+ **CRITICAL**: This React + Vite application integrates Modus Web Components using the React wrapper package with proper provider setup and event handling patterns.
12
+
13
+ **Integration**: `@trimble-oss/moduswebcomponents-react` v1.0.0-react19 with React 19 compatibility
14
+
15
+ ## 📦 **Package Dependencies**
16
+
17
+ ### ✅ **Required Dependencies**
18
+
19
+ ```json
20
+ {
21
+ "dependencies": {
22
+ "@trimble-oss/moduswebcomponents-react": "^1.0.0-react19",
23
+ "@trimble-oss/modus-icons": "^1.18.0",
24
+ "react": "^19.1.1",
25
+ "react-dom": "^19.1.1",
26
+ "react-router-dom": "^7.9.4",
27
+ "tailwindcss": "^3.4.18"
28
+ }
29
+ }
30
+ ```
31
+
32
+ ### ✅ **CSS Import Order**
33
+
34
+ ```css
35
+ /* ✅ CORRECT: CSS import order in src/index.css */
36
+ @import url("https://cdn.jsdelivr.net/npm/@trimble-oss/modus-icons@1.17.0/dist/field-systems/fonts/modus-icons.css");
37
+ @import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;500;600;700&display=swap");
38
+ @tailwind base;
39
+ @tailwind components;
40
+ @tailwind utilities;
41
+ ```
42
+
43
+ ## 🎯 **Provider Setup**
44
+
45
+ ### ✅ **ModusProvider Integration**
46
+
47
+ ```tsx
48
+ // ✅ CORRECT: ModusProvider setup in App.tsx
49
+ import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
50
+ import { Suspense } from "react";
51
+ import ModusProvider from "./components/ModusProvider";
52
+ import { ThemeProvider } from "./contexts/ThemeContext";
53
+
54
+ function App() {
55
+ return (
56
+ <ThemeProvider>
57
+ <ModusProvider>
58
+ <Router>
59
+ <div className="min-h-screen flex flex-col">
60
+ <AppHeader />
61
+ <div className="flex-1">
62
+ <Suspense
63
+ fallback={
64
+ <div className="flex items-center justify-center min-h-screen">
65
+ Loading...
66
+ </div>
67
+ }
68
+ >
69
+ <Routes>
70
+ <Route path="/" element={<></>} />
71
+ <Route path="/components" element={<ComponentsDemo />} />
72
+ {/* Dynamic routes */}
73
+ </Routes>
74
+ </Suspense>
75
+ </div>
76
+ <AppFooter />
77
+ </div>
78
+ </Router>
79
+ </ModusProvider>
80
+ </ThemeProvider>
81
+ );
82
+ }
83
+ ```
84
+
85
+ ### ✅ **ModusProvider Component**
86
+
87
+ ```tsx
88
+ // ✅ CORRECT: ModusProvider component
89
+ import { ReactNode } from "react";
90
+
91
+ interface ModusProviderProps {
92
+ children: ReactNode;
93
+ }
94
+
95
+ export default function ModusProvider({ children }: ModusProviderProps) {
96
+ return <>{children}</>;
97
+ }
98
+ ```
99
+
100
+ ## 🎨 **Component Integration Patterns**
101
+
102
+ ### ✅ **Basic Component Usage**
103
+
104
+ ```tsx
105
+ // ✅ CORRECT: Basic Modus component usage
106
+ import {
107
+ ModusWcButton,
108
+ ModusWcTextInput,
109
+ ModusWcCard,
110
+ } from "@trimble-oss/moduswebcomponents-react";
111
+
112
+ function BasicComponents() {
113
+ return (
114
+ <div className="space-y-4">
115
+ <ModusWcButton className="bg-primary text-primary-foreground">
116
+ Click me
117
+ </ModusWcButton>
118
+
119
+ <ModusWcTextInput
120
+ placeholder="Enter text"
121
+ className="w-full border border-input rounded"
122
+ />
123
+
124
+ <ModusWcCard className="p-4">
125
+ <div slot="header">Card Header</div>
126
+ <div>Card content</div>
127
+ </ModusWcCard>
128
+ </div>
129
+ );
130
+ }
131
+ ```
132
+
133
+ ### ✅ **Event Handling Patterns**
134
+
135
+ ```tsx
136
+ // ✅ CORRECT: Event handling with refs
137
+ import { useRef, useEffect } from "react";
138
+ import {
139
+ ModusWcButton,
140
+ ModusWcTextInput,
141
+ } from "@trimble-oss/moduswebcomponents-react";
142
+
143
+ function EventHandlingComponent() {
144
+ const buttonRef = useRef<ModusWcButton>(null);
145
+ const inputRef = useRef<ModusWcTextInput>(null);
146
+
147
+ useEffect(() => {
148
+ const button = buttonRef.current;
149
+ const input = inputRef.current;
150
+
151
+ if (!button || !input) return;
152
+
153
+ const handleButtonClick = (event: CustomEvent) => {
154
+ console.log("Button clicked:", event.detail);
155
+ };
156
+
157
+ const handleInputChange = (event: CustomEvent) => {
158
+ console.log("Input changed:", event.detail);
159
+ };
160
+
161
+ button.addEventListener("buttonClick", handleButtonClick);
162
+ input.addEventListener("inputChange", handleInputChange);
163
+
164
+ return () => {
165
+ button.removeEventListener("buttonClick", handleButtonClick);
166
+ input.removeEventListener("inputChange", handleInputChange);
167
+ };
168
+ }, []);
169
+
170
+ return (
171
+ <div className="space-y-4">
172
+ <ModusWcButton ref={buttonRef}>Click me</ModusWcButton>
173
+
174
+ <ModusWcTextInput
175
+ ref={inputRef}
176
+ placeholder="Type something"
177
+ className="w-full"
178
+ />
179
+ </div>
180
+ );
181
+ }
182
+ ```
183
+
184
+ ### ✅ **State Management Integration**
185
+
186
+ ```tsx
187
+ // ✅ CORRECT: State management with Modus components
188
+ import { useState, useRef, useEffect } from "react";
189
+ import {
190
+ ModusWcModal,
191
+ ModusWcButton,
192
+ } from "@trimble-oss/moduswebcomponents-react";
193
+
194
+ function StatefulComponent() {
195
+ const [isModalOpen, setIsModalOpen] = useState(false);
196
+ const modalRef = useRef<ModusWcModal>(null);
197
+
198
+ const openModal = () => {
199
+ if (modalRef.current) {
200
+ const dialog = modalRef.current.querySelector(
201
+ "dialog"
202
+ ) as HTMLDialogElement;
203
+ if (dialog) {
204
+ dialog.showModal();
205
+ setIsModalOpen(true);
206
+ }
207
+ }
208
+ };
209
+
210
+ const closeModal = () => {
211
+ if (modalRef.current) {
212
+ const dialog = modalRef.current.querySelector(
213
+ "dialog"
214
+ ) as HTMLDialogElement;
215
+ if (dialog) {
216
+ dialog.close();
217
+ setIsModalOpen(false);
218
+ }
219
+ }
220
+ };
221
+
222
+ return (
223
+ <div>
224
+ <ModusWcButton onClick={openModal}>Open Modal</ModusWcButton>
225
+
226
+ <ModusWcModal ref={modalRef}>
227
+ <div slot="header">Modal Title</div>
228
+ <div slot="body">Modal content</div>
229
+ <div slot="footer">
230
+ <ModusWcButton onClick={closeModal}>Close</ModusWcButton>
231
+ </div>
232
+ </ModusWcModal>
233
+ </div>
234
+ );
235
+ }
236
+ ```
237
+
238
+ ## 🎨 **Styling Integration**
239
+
240
+ ### ✅ **Design System Integration**
241
+
242
+ ```tsx
243
+ // ✅ CORRECT: Design system integration
244
+ import {
245
+ ModusWcButton,
246
+ ModusWcCard,
247
+ } from "@trimble-oss/moduswebcomponents-react";
248
+
249
+ function StyledComponents() {
250
+ return (
251
+ <div className="space-y-4">
252
+ <ModusWcButton
253
+ className="
254
+ bg-primary text-primary-foreground
255
+ hover:bg-primary/90
256
+ focus:ring-2 focus:ring-ring
257
+ transition-colors
258
+ px-4 py-2 rounded
259
+ "
260
+ >
261
+ Primary Button
262
+ </ModusWcButton>
263
+
264
+ <ModusWcCard
265
+ className="
266
+ bg-card text-card-foreground
267
+ border border-border
268
+ rounded-lg p-4
269
+ "
270
+ >
271
+ <div slot="header">Card Header</div>
272
+ <div>Card content</div>
273
+ </ModusWcCard>
274
+ </div>
275
+ );
276
+ }
277
+ ```
278
+
279
+ ### ✅ **Theme Integration**
280
+
281
+ ```tsx
282
+ // ✅ CORRECT: Theme integration with Modus components
283
+ import { useTheme } from "../hooks/useTheme";
284
+ import { ModusWcButton } from "@trimble-oss/moduswebcomponents-react";
285
+
286
+ function ThemedComponent() {
287
+ const { theme, isDark } = useTheme();
288
+
289
+ return (
290
+ <div className="bg-background text-foreground p-4">
291
+ <div className="text-lg font-semibold mb-4">Current theme: {theme}</div>
292
+
293
+ <ModusWcButton
294
+ className={`
295
+ ${
296
+ isDark
297
+ ? "bg-primary text-primary-foreground"
298
+ : "bg-secondary text-secondary-foreground"
299
+ }
300
+ hover:opacity-90
301
+ transition-opacity
302
+ px-4 py-2 rounded
303
+ `}
304
+ >
305
+ Themed Button
306
+ </ModusWcButton>
307
+ </div>
308
+ );
309
+ }
310
+ ```
311
+
312
+ ## 🚀 **Vite-Specific Integration**
313
+
314
+ ### ✅ **Environment Variables**
315
+
316
+ ```tsx
317
+ // ✅ CORRECT: Environment variables in Vite
318
+ import { ModusWcButton } from "@trimble-oss/moduswebcomponents-react";
319
+
320
+ function EnvironmentComponent() {
321
+ const apiUrl = import.meta.env.VITE_API_URL;
322
+ const isDevelopment = import.meta.env.DEV;
323
+
324
+ return (
325
+ <div className="bg-background text-foreground p-4">
326
+ <div className="text-sm text-muted-foreground mb-2">
327
+ API URL: {apiUrl}
328
+ </div>
329
+ <div className="text-sm text-muted-foreground mb-4">
330
+ Environment: {isDevelopment ? "Development" : "Production"}
331
+ </div>
332
+
333
+ <ModusWcButton className="bg-primary text-primary-foreground px-4 py-2 rounded">
334
+ Environment Button
335
+ </ModusWcButton>
336
+ </div>
337
+ );
338
+ }
339
+ ```
340
+
341
+ ### ✅ **Dynamic Imports**
342
+
343
+ ```tsx
344
+ // ✅ CORRECT: Dynamic imports with Modus components
345
+ import { lazy, Suspense } from "react";
346
+ import { ModusWcButton } from "@trimble-oss/moduswebcomponents-react";
347
+
348
+ const LazyComponent = lazy(() => import("./LazyComponent"));
349
+
350
+ function DynamicImportComponent() {
351
+ return (
352
+ <div className="space-y-4">
353
+ <ModusWcButton className="bg-primary text-primary-foreground px-4 py-2 rounded">
354
+ Load Lazy Component
355
+ </ModusWcButton>
356
+
357
+ <Suspense
358
+ fallback={
359
+ <div className="flex items-center justify-center p-4">
360
+ <div className="text-foreground">Loading...</div>
361
+ </div>
362
+ }
363
+ >
364
+ <LazyComponent />
365
+ </Suspense>
366
+ </div>
367
+ );
368
+ }
369
+ ```
370
+
371
+ ## 🔧 **TypeScript Integration**
372
+
373
+ ### ✅ **TypeScript Configuration**
374
+
375
+ ```json
376
+ // ✅ CORRECT: TypeScript configuration
377
+ {
378
+ "compilerOptions": {
379
+ "target": "ES2020",
380
+ "useDefineForClassFields": true,
381
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
382
+ "module": "ESNext",
383
+ "skipLibCheck": true,
384
+ "moduleResolution": "bundler",
385
+ "allowImportingTsExtensions": true,
386
+ "resolveJsonModule": true,
387
+ "isolatedModules": true,
388
+ "noEmit": true,
389
+ "jsx": "react-jsx",
390
+ "strict": true,
391
+ "noUnusedLocals": true,
392
+ "noUnusedParameters": true,
393
+ "noFallthroughCasesInSwitch": true
394
+ },
395
+ "include": ["src"]
396
+ }
397
+ ```
398
+
399
+ ### ✅ **Component Type Definitions**
400
+
401
+ ```tsx
402
+ // ✅ CORRECT: Component type definitions
403
+ import {
404
+ ModusWcButton,
405
+ ModusWcTextInput,
406
+ ModusWcCard,
407
+ } from "@trimble-oss/moduswebcomponents-react";
408
+
409
+ interface ComponentProps {
410
+ title: string;
411
+ description?: string;
412
+ onAction?: () => void;
413
+ }
414
+
415
+ function TypedComponent({ title, description, onAction }: ComponentProps) {
416
+ return (
417
+ <div className="space-y-4">
418
+ <ModusWcCard className="bg-card text-card-foreground border border-border rounded-lg p-4">
419
+ <div slot="header" className="text-lg font-semibold">
420
+ {title}
421
+ </div>
422
+ <div className="text-sm text-muted-foreground">{description}</div>
423
+ </ModusWcCard>
424
+
425
+ {onAction && (
426
+ <ModusWcButton
427
+ onClick={onAction}
428
+ className="bg-primary text-primary-foreground px-4 py-2 rounded"
429
+ >
430
+ Action Button
431
+ </ModusWcButton>
432
+ )}
433
+ </div>
434
+ );
435
+ }
436
+ ```
437
+
438
+ ## 🚫 **Common Pitfalls**
439
+
440
+ ### ❌ **Don't Use Direct Method Access**
441
+
442
+ ```tsx
443
+ // ❌ WRONG: Direct method access
444
+ const buttonRef = useRef<ModusWcButton>(null);
445
+
446
+ const handleClick = () => {
447
+ buttonRef.current?.click(); // ❌ This won't work
448
+ };
449
+
450
+ // ✅ CORRECT: Event handling
451
+ const handleClick = (event: CustomEvent) => {
452
+ console.log("Button clicked:", event.detail);
453
+ };
454
+ ```
455
+
456
+ ### ❌ **Don't Mix Event Handling Patterns**
457
+
458
+ ```tsx
459
+ // ❌ WRONG: Mixing event handling patterns
460
+ <ModusWcButton
461
+ onClick={handleClick} // ❌ React event
462
+ onInputChange={handleChange} // ❌ Custom event
463
+ >
464
+ Button
465
+ </ModusWcButton>
466
+
467
+ // ✅ CORRECT: Consistent event handling
468
+ <ModusWcButton ref={buttonRef}>
469
+ Button
470
+ </ModusWcButton>
471
+ ```
472
+
473
+ ### ❌ **Don't Ignore CSS Import Order**
474
+
475
+ ```css
476
+ /* ❌ WRONG: Incorrect CSS import order */
477
+ @tailwind base;
478
+ @tailwind components;
479
+ @tailwind utilities;
480
+ @import url("https://cdn.jsdelivr.net/npm/@trimble-oss/modus-icons@1.17.0/dist/field-systems/fonts/modus-icons.css");
481
+
482
+ /* ✅ CORRECT: Proper CSS import order */
483
+ @import url("https://cdn.jsdelivr.net/npm/@trimble-oss/modus-icons@1.17.0/dist/field-systems/fonts/modus-icons.css");
484
+ @tailwind base;
485
+ @tailwind components;
486
+ @tailwind utilities;
487
+ ```
488
+
489
+ ## 🎯 **Key Takeaways**
490
+
491
+ 1. **Provider Setup**: Use ModusProvider and ThemeProvider for proper integration
492
+ 2. **Event Handling**: Use refs and event listeners for Modus Web Components
493
+ 3. **CSS Import Order**: Import Modus icons before Tailwind CSS
494
+ 4. **TypeScript**: Proper type definitions for Modus components
495
+ 5. **Vite Patterns**: Use Vite-specific patterns for environment variables and assets
496
+
497
+ ## 🔍 **Integration Checklist**
498
+
499
+ - [ ] ✅ **Package Dependencies**: Correct Modus React package version
500
+ - [ ] ✅ **CSS Import Order**: Modus icons imported before Tailwind
501
+ - [ ] ✅ **Provider Setup**: ModusProvider and ThemeProvider configured
502
+ - [ ] ✅ **Event Handling**: Proper event handling with refs and listeners
503
+ - [ ] ✅ **TypeScript**: Proper type definitions for components
504
+ - [ ] ✅ **Vite Integration**: Environment variables and dynamic imports
505
+ - [ ] ✅ **Theme Integration**: Theme-aware components with conditional styling
506
+
507
+ ---
508
+
509
+ **Remember: This React + Vite application integrates Modus Web Components using the React wrapper package with proper provider setup, event handling patterns, and CSS import order. Always use refs for event handling and ensure proper CSS import order for Modus icons.**
@@ -0,0 +1,23 @@
1
+ ---
2
+ description: Critical React key prop patterns for Modus Web Components
3
+ globs: ["**/*.tsx"]
4
+ alwaysApply: true
5
+ ---
6
+
7
+ # Modus React Key Warnings - Short
8
+
9
+ Critical React key prop patterns for Modus Web Components.
10
+
11
+ ## Key Rules
12
+
13
+ - **Use composite keys for web components** - `${value}-${index}` pattern for uniqueness
14
+ - **Props over slots for icons** - Use `start-icon={icon}` not `<i slot="start-icon">`
15
+ - **Avoid div wrappers** - Let web components render directly
16
+ - **Never use array index as key** - Use stable identifiers when items can reorder
17
+ - **Handle dynamic content safely** - Use stable identifiers for keys
18
+ - **Test in Chrome DevTools** - Verify no React warnings in console
19
+ - **Follow Modus patterns** - Use established component patterns
20
+
21
+ ## Reference
22
+
23
+ For detailed key patterns, common pitfalls, and advanced React techniques, fetch the full rule: `modus-react-key-warnings`