@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,452 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Semantic HTML Linting Script for Vite + React
5
+ *
6
+ * This script checks for usage of semantic HTML elements that should be replaced with div elements
7
+ * and Tailwind classes to ensure consistent styling and avoid browser default style conflicts.
8
+ *
9
+ * It flags semantic HTML elements and suggests div alternatives with appropriate Tailwind classes.
10
+ */
11
+
12
+ import fs from "fs";
13
+ import path from "path";
14
+ import { glob } from "glob";
15
+
16
+ // Semantic HTML elements to detect (should be replaced with div + Tailwind)
17
+ // Updated patterns to be more specific and avoid TypeScript/JavaScript syntax
18
+ const SEMANTIC_HTML_PATTERNS = [
19
+ // Headings - more specific to avoid matching TypeScript generics
20
+ /<h[1-6](?:\s+[^>]*)?>/g,
21
+
22
+ // Semantic sections
23
+ /<section(?:\s+[^>]*)?>/g,
24
+ /<header(?:\s+[^>]*)?>/g,
25
+ /<footer(?:\s+[^>]*)?>/g,
26
+ /<main(?:\s+[^>]*)?>/g,
27
+ /<article(?:\s+[^>]*)?>/g,
28
+ /<aside(?:\s+[^>]*)?>/g,
29
+ /<nav(?:\s+[^>]*)?>/g,
30
+
31
+ // Text elements - more specific patterns
32
+ /<p(?:\s+[^>]*)?>/g,
33
+ /<span(?:\s+[^>]*)?>/g,
34
+
35
+ // Lists
36
+ /<ul(?:\s+[^>]*)?>/g,
37
+ /<ol(?:\s+[^>]*)?>/g,
38
+ /<li(?:\s+[^>]*)?>/g,
39
+
40
+ // Other semantic elements - more specific patterns
41
+ /<button(?:\s+[^>]*)?>/g,
42
+ /<blockquote(?:\s+[^>]*)?>/g,
43
+ /<cite(?:\s+[^>]*)?>/g,
44
+ /<address(?:\s+[^>]*)?>/g,
45
+ /<time(?:\s+[^>]*)?>/g,
46
+ /<mark(?:\s+[^>]*)?>/g,
47
+ /<small(?:\s+[^>]*)?>/g,
48
+ /<strong(?:\s+[^>]*)?>/g,
49
+ /<em(?:\s+[^>]*)?>/g,
50
+ /<b(?:\s+[^>]*)?>/g,
51
+ /<i(?:\s+[^>]*)?>/g,
52
+ /<u(?:\s+[^>]*)?>/g,
53
+ // More specific patterns for potentially problematic elements
54
+ /<s(?:\s+[^>]*)?>/g, // Only match <s> with attributes or closing
55
+ /<del(?:\s+[^>]*)?>/g,
56
+ /<ins(?:\s+[^>]*)?>/g,
57
+ /<sub(?:\s+[^>]*)?>/g,
58
+ /<sup(?:\s+[^>]*)?>/g,
59
+ /<pre(?:\s+[^>]*)?>/g,
60
+ /<kbd(?:\s+[^>]*)?>/g,
61
+ /<samp(?:\s+[^>]*)?>/g,
62
+ /<var(?:\s+[^>]*)?>/g,
63
+ /<dfn(?:\s+[^>]*)?>/g,
64
+ /<abbr(?:\s+[^>]*)?>/g,
65
+ /<acronym(?:\s+[^>]*)?>/g,
66
+ /<q(?:\s+[^>]*)?>/g,
67
+ ];
68
+
69
+ // Files to check
70
+ const FILE_PATTERNS = [
71
+ "src/**/*.tsx",
72
+ "src/**/*.ts",
73
+ "src/**/*.jsx",
74
+ "src/**/*.js",
75
+ "src/**/*.css",
76
+ "src/**/*.scss",
77
+ "*.tsx",
78
+ "*.ts",
79
+ "*.js",
80
+ "test-*.tsx",
81
+ "test-*.ts",
82
+ "test-*.js",
83
+ ];
84
+
85
+ // Files to exclude
86
+ const EXCLUDE_PATTERNS = [
87
+ "node_modules/**",
88
+ "dist/**",
89
+ "build/**",
90
+ "**/*.d.ts",
91
+ "scripts/**",
92
+ "**/*.md",
93
+ "**/*.mdx",
94
+ "**/*.txt",
95
+ "**/*.json",
96
+ "**/*.yml",
97
+ "**/*.yaml",
98
+ "**/*.xml",
99
+ "**/*.html",
100
+ "**/*.svg",
101
+ "**/*.png",
102
+ "**/*.jpg",
103
+ "**/*.jpeg",
104
+ "**/*.gif",
105
+ "**/*.ico",
106
+ "**/*.pdf",
107
+ "**/*.doc",
108
+ "**/*.docx",
109
+ ];
110
+
111
+ // Tailwind alternatives for common semantic elements
112
+ const TAILWIND_ALTERNATIVES = {
113
+ // Headings
114
+ "<h1": '<div className="text-4xl font-bold',
115
+ "<h2": '<div className="text-3xl font-semibold',
116
+ "<h3": '<div className="text-2xl font-semibold',
117
+ "<h4": '<div className="text-xl font-semibold',
118
+ "<h5": '<div className="text-lg font-semibold',
119
+ "<h6": '<div className="text-base font-semibold',
120
+
121
+ // Sections
122
+ "<section": '<div className="',
123
+ "<header": '<div className="',
124
+ "<footer": '<div className="',
125
+ "<main": '<div className="',
126
+ "<article": '<div className="',
127
+ "<aside": '<div className="',
128
+ "<nav": '<div className="',
129
+
130
+ // Text elements
131
+ "<p": '<div className="text-base',
132
+ "<span": '<div className="',
133
+
134
+ // Lists
135
+ "<ul": '<div className="list-none',
136
+ "<ol": '<div className="list-none',
137
+ "<li": '<div className="',
138
+
139
+ // Other elements
140
+ "<button": '<ModusWcButton color="primary"',
141
+ "<blockquote": '<div className="border-l-4 pl-4 italic border-left-default',
142
+ "<cite": '<div className="text-sm text-muted-foreground italic',
143
+ "<address": '<div className="text-sm not-italic',
144
+ "<time": '<div className="text-sm',
145
+ "<mark": '<div className="bg-yellow-200 dark:bg-yellow-800',
146
+ "<small": '<div className="text-sm',
147
+ "<strong": '<div className="font-bold',
148
+ "<em": '<div className="italic',
149
+ "<b": '<div className="font-bold',
150
+ "<i": '<div className="italic',
151
+ "<u": '<div className="underline',
152
+ "<s": '<div className="line-through',
153
+ "<del": '<div className="line-through',
154
+ "<ins": '<div className="underline',
155
+ "<sub": '<div className="text-xs align-sub',
156
+ "<sup": '<div className="text-xs align-super',
157
+ "<pre":
158
+ '<div className="bg-muted p-4 rounded text-sm font-mono overflow-x-auto',
159
+ "<kbd": '<div className="bg-muted px-2 py-1 rounded text-sm font-mono border',
160
+ "<samp": '<div className="bg-muted px-1 py-0.5 rounded text-sm font-mono',
161
+ "<var": '<div className="italic',
162
+ "<dfn": '<div className="italic',
163
+ "<abbr": '<div className="underline decoration-dotted',
164
+ "<acronym": '<div className="underline decoration-dotted',
165
+ "<q": '<div className="italic',
166
+ };
167
+
168
+ function getTailwindSuggestion(element) {
169
+ // Try to find exact matches first
170
+ for (const [semanticElement, tailwindAlternative] of Object.entries(
171
+ TAILWIND_ALTERNATIVES
172
+ )) {
173
+ if (element.includes(semanticElement)) {
174
+ return tailwindAlternative;
175
+ }
176
+ }
177
+
178
+ // Generic suggestions based on common patterns
179
+ if (element.includes("<h")) {
180
+ return '<div className="text-lg font-semibold';
181
+ }
182
+ if (
183
+ element.includes("<section") ||
184
+ element.includes("<header") ||
185
+ element.includes("<footer")
186
+ ) {
187
+ return '<div className="';
188
+ }
189
+ if (element.includes("<p")) {
190
+ return '<div className="text-base';
191
+ }
192
+ if (element.includes("<ul") || element.includes("<ol")) {
193
+ return '<div className="list-none';
194
+ }
195
+ if (element.includes("<strong") || element.includes("<b")) {
196
+ return '<div className="font-bold';
197
+ }
198
+ if (element.includes("<em") || element.includes("<i")) {
199
+ return '<div className="italic';
200
+ }
201
+
202
+ return '<div className="';
203
+ }
204
+
205
+ function isAllowedSemanticElement(element, content, matchIndex) {
206
+ // Allow certain semantic elements in specific contexts
207
+ const beforeMatch = content.substring(0, matchIndex);
208
+ const afterMatch = content.substring(matchIndex + element.length);
209
+
210
+ // Check if the element is in a JSX comment
211
+ const commentStart = beforeMatch.lastIndexOf("/*");
212
+ const commentEnd = beforeMatch.lastIndexOf("*/");
213
+ if (commentStart > commentEnd) {
214
+ return true;
215
+ }
216
+
217
+ // Check if this is TypeScript/JavaScript syntax, not HTML
218
+ // Look for patterns that indicate TypeScript generics or JavaScript syntax
219
+ const typescriptPatterns = [
220
+ // TypeScript generics: <Map<string, number>>, <string>, <boolean>
221
+ /<[A-Z][a-zA-Z]*<[^>]*>>/,
222
+ /<[a-zA-Z]+(?:,\s*[a-zA-Z]+)*>/,
223
+ // Function calls: <string, number>
224
+ /<[a-zA-Z]+(?:,\s*[a-zA-Z]+)*>/,
225
+ // Array types: <string[]>
226
+ /<[a-zA-Z]+\[\]>/,
227
+ // Union types: <string | number>
228
+ /<[a-zA-Z]+\s*\|\s*[a-zA-Z]+>/,
229
+ ];
230
+
231
+ for (const pattern of typescriptPatterns) {
232
+ if (pattern.test(element)) {
233
+ return true;
234
+ }
235
+ }
236
+
237
+ // Check if the element is part of TypeScript/JavaScript syntax
238
+ // Look for context clues like type annotations, generics, etc.
239
+ const contextBefore = beforeMatch.slice(-50); // Last 50 characters before match
240
+ const contextAfter = afterMatch.slice(0, 50); // First 50 characters after match
241
+
242
+ // TypeScript/JavaScript context patterns
243
+ const codeContextPatterns = [
244
+ // Type annotations: : <string>
245
+ /:\s*$/,
246
+ // Generic parameters: <T extends
247
+ /<[A-Z]\w*\s+extends/,
248
+ // Function parameters: (<string, number>
249
+ /\(\s*$/,
250
+ // Array declarations: Array<
251
+ /Array\s*$/,
252
+ // Map/Set declarations: Map<, Set<
253
+ /(Map|Set)\s*$/,
254
+ // React component props: <ComponentProps<
255
+ /<[A-Z]\w*Props\s*$/,
256
+ // useRef declarations: useRef<
257
+ /useRef\s*$/,
258
+ // useState declarations: useState<
259
+ /useState\s*$/,
260
+ // useCallback declarations: useCallback<
261
+ /useCallback\s*$/,
262
+ // useMemo declarations: useMemo<
263
+ /useMemo\s*$/,
264
+ ];
265
+
266
+ for (const pattern of codeContextPatterns) {
267
+ if (pattern.test(contextBefore)) {
268
+ return true;
269
+ }
270
+ }
271
+
272
+ // Check if the element is in a string literal (but not JSX attributes)
273
+ // Look for quotes that are actually part of string literals, not JSX attributes
274
+ const singleQuoteStart = beforeMatch.lastIndexOf("'");
275
+ const doubleQuoteStart = beforeMatch.lastIndexOf('"');
276
+ const backtickStart = beforeMatch.lastIndexOf("`");
277
+ const lastQuote = Math.max(singleQuoteStart, doubleQuoteStart, backtickStart);
278
+
279
+ if (lastQuote > Math.max(commentStart, commentEnd)) {
280
+ // Check if this quote is part of a JSX attribute (className="...", style="...", etc.)
281
+ // or if it's actually a string literal
282
+ const beforeQuote = content.substring(0, lastQuote);
283
+
284
+ // Look for JSX attribute patterns before the quote
285
+ const jsxAttributePattern =
286
+ /(className|style|id|aria-\w+|data-\w+|on\w+)\s*=\s*$/;
287
+ if (jsxAttributePattern.test(beforeQuote)) {
288
+ // This is a JSX attribute, not a string literal - don't allow
289
+ return false;
290
+ }
291
+
292
+ // Check if the quote is actually part of a string literal
293
+ // Look for assignment patterns like const str = "..." or function calls like console.log("...")
294
+ const stringLiteralPattern = /(=\s*|\(\s*|,\s*|:\s*)\s*$/;
295
+ if (stringLiteralPattern.test(beforeQuote)) {
296
+ return true;
297
+ }
298
+ }
299
+
300
+ // Check if it's styled-jsx syntax (should be allowed)
301
+ if (element.includes("<style jsx") || element.includes("<style jsx global")) {
302
+ return true;
303
+ }
304
+
305
+ // Allow <i> elements that are used for Modus icons
306
+ if (element.includes("<i") && element.includes("modus-icons")) {
307
+ return true;
308
+ }
309
+
310
+ // Check if this looks like a real HTML element (has proper attributes or closing)
311
+ // Real HTML elements typically have spaces, attributes, or are self-closing
312
+ const hasAttributes = element.includes(" ") || element.includes("=");
313
+ const isSelfClosing = element.endsWith("/>");
314
+ const hasProperStructure = hasAttributes || isSelfClosing;
315
+
316
+ // If it doesn't have proper HTML structure and looks like code syntax, allow it
317
+ if (!hasProperStructure) {
318
+ // Check if it's followed by code syntax (>, =, etc.)
319
+ if (/^[>,=]/.test(contextAfter)) {
320
+ return true;
321
+ }
322
+ }
323
+
324
+ return false;
325
+ }
326
+
327
+ async function checkFile(filePath) {
328
+ const content = fs.readFileSync(filePath, "utf8");
329
+ const violations = [];
330
+
331
+ for (const pattern of SEMANTIC_HTML_PATTERNS) {
332
+ let match;
333
+ while ((match = pattern.exec(content)) !== null) {
334
+ const line = content.substring(0, match.index).split("\n").length;
335
+ const column = match.index - content.lastIndexOf("\n", match.index - 1);
336
+
337
+ const element = match[0];
338
+
339
+ // Skip if it's an allowed semantic element
340
+ if (isAllowedSemanticElement(element, content, match.index)) {
341
+ continue;
342
+ }
343
+
344
+ const suggestion = getTailwindSuggestion(element);
345
+
346
+ violations.push({
347
+ file: filePath,
348
+ line,
349
+ column,
350
+ match: match[0],
351
+ message: `Semantic HTML element detected: "${match[0]}". Use div with Tailwind classes instead.`,
352
+ suggestion: suggestion,
353
+ });
354
+ }
355
+ pattern.lastIndex = 0;
356
+ }
357
+
358
+ return violations;
359
+ }
360
+
361
+ async function main() {
362
+ console.log(
363
+ "šŸŽØ Checking for semantic HTML elements that should use div + Tailwind classes in Vite + React app...\n"
364
+ );
365
+
366
+ let allViolations = [];
367
+
368
+ try {
369
+ // Get all files to check
370
+ const files = await glob(FILE_PATTERNS, {
371
+ ignore: EXCLUDE_PATTERNS,
372
+ absolute: true,
373
+ });
374
+
375
+ // Check each file
376
+ for (const file of files) {
377
+ try {
378
+ const violations = await checkFile(file);
379
+ allViolations = allViolations.concat(violations);
380
+ } catch (error) {
381
+ console.warn(
382
+ `āš ļø Warning: Could not check file ${file}: ${error.message}`
383
+ );
384
+ }
385
+ }
386
+
387
+ // Report results
388
+ if (allViolations.length === 0) {
389
+ console.log(
390
+ "āœ… All files are using div elements with Tailwind classes correctly!"
391
+ );
392
+ console.log(
393
+ "šŸ“ Note: Semantic HTML elements are avoided to prevent browser default style conflicts"
394
+ );
395
+ process.exit(0);
396
+ } else {
397
+ console.log(
398
+ `āŒ Found ${allViolations.length} semantic HTML violations:\n`
399
+ );
400
+
401
+ // Group violations by file
402
+ const violationsByFile = allViolations.reduce((acc, violation) => {
403
+ if (!acc[violation.file]) {
404
+ acc[violation.file] = [];
405
+ }
406
+ acc[violation.file].push(violation);
407
+ return acc;
408
+ }, {});
409
+
410
+ // Print violations
411
+ for (const [file, violations] of Object.entries(violationsByFile)) {
412
+ const relativePath = path.relative(process.cwd(), file);
413
+ console.log(`šŸ“„ ${relativePath}:`);
414
+
415
+ for (const violation of violations) {
416
+ console.log(
417
+ ` ${violation.line}:${violation.column} - ${violation.message}`
418
+ );
419
+ console.log(` šŸ’” Suggestion: ${violation.suggestion}`);
420
+ }
421
+ console.log();
422
+ }
423
+
424
+ console.log("šŸ’” Tailwind Classes Reference:");
425
+ console.log(
426
+ " āœ… Headings: text-4xl font-bold, text-3xl font-semibold, text-2xl font-semibold"
427
+ );
428
+ console.log(" āœ… Sections: Use div with appropriate layout classes");
429
+ console.log(" āœ… Text: text-base, text-sm, text-lg, text-xl");
430
+ console.log(
431
+ " āœ… Typography: font-bold, font-semibold, italic, underline"
432
+ );
433
+ console.log(" āœ… Layout: flex, grid, block, inline-block");
434
+ console.log(" āœ… Spacing: p-4, m-2, px-4, py-2, gap-4");
435
+ console.log(
436
+ " āœ… Colors: text-foreground, text-muted-foreground, bg-background"
437
+ );
438
+ console.log(
439
+ " šŸ“ Note: Use div elements to avoid browser default styles and ensure consistent Tailwind behavior"
440
+ );
441
+ console.log(" šŸ“– Documentation: https://tailwindcss.com/docs");
442
+
443
+ process.exit(1);
444
+ }
445
+ } catch (error) {
446
+ console.error("šŸ’„ Error running semantic HTML check:", error.message);
447
+ process.exit(1);
448
+ }
449
+ }
450
+
451
+ // Run the script
452
+ main();
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * TypeScript Type Checking Script for Angular
5
+ *
6
+ * This script runs TypeScript type checking with enhanced developer experience,
7
+ * providing clear success/failure messages and helpful error formatting.
8
+ */
9
+
10
+ import { execSync } from 'child_process';
11
+ import path from 'path';
12
+
13
+ function formatTypeScriptError(errorOutput) {
14
+ const lines = errorOutput.split('\n');
15
+ const formattedErrors = [];
16
+
17
+ for (const line of lines) {
18
+ if (line.includes('.ts') || line.includes('.html')) {
19
+ // Extract file path and line info
20
+ const match = line.match(/([^(]+)\((\d+),(\d+)\): error TS(\d+): (.+)/);
21
+ if (match) {
22
+ const [, filePath, lineNum, colNum, errorCode, message] = match;
23
+ const relativePath = path.relative(process.cwd(), filePath);
24
+ formattedErrors.push({
25
+ file: relativePath,
26
+ line: parseInt(lineNum),
27
+ column: parseInt(colNum),
28
+ code: errorCode,
29
+ message: message.trim(),
30
+ fullLine: line,
31
+ });
32
+ }
33
+ }
34
+ }
35
+
36
+ return formattedErrors;
37
+ }
38
+
39
+ function runTypeCheck() {
40
+ try {
41
+ console.log('šŸ” Running TypeScript type checking...\n');
42
+
43
+ // Run TypeScript compiler with noEmit
44
+ execSync('npx tsc --noEmit --pretty', {
45
+ encoding: 'utf8',
46
+ stdio: 'pipe',
47
+ });
48
+
49
+ // If we get here, no errors were found
50
+ console.log('āœ… All TypeScript files are type-safe!');
51
+ console.log('šŸŽÆ No type errors found in the codebase.');
52
+ return { success: true, errors: [] };
53
+ } catch (error) {
54
+ // TypeScript found errors
55
+ const errorOutput = error.stdout || error.stderr || error.message;
56
+ const formattedErrors = formatTypeScriptError(errorOutput);
57
+
58
+ console.log(`āŒ Found ${formattedErrors.length} TypeScript errors:\n`);
59
+
60
+ // Group errors by file
61
+ const errorsByFile = formattedErrors.reduce((acc, error) => {
62
+ if (!acc[error.file]) {
63
+ acc[error.file] = [];
64
+ }
65
+ acc[error.file].push(error);
66
+ return acc;
67
+ }, {});
68
+
69
+ // Print errors grouped by file
70
+ for (const [file, errors] of Object.entries(errorsByFile)) {
71
+ console.log(`šŸ“„ ${file}:`);
72
+
73
+ for (const error of errors) {
74
+ console.log(
75
+ ` ${error.line}:${error.column} - TS${error.code}: ${error.message}`
76
+ );
77
+ }
78
+ console.log();
79
+ }
80
+
81
+ // Provide helpful suggestions
82
+ console.log('šŸ’” TypeScript Error Resolution Tips:');
83
+ console.log(' • Check for missing type annotations');
84
+ console.log(' • Verify import/export statements');
85
+ console.log(' • Ensure proper interface definitions');
86
+ console.log(' • Check for null/undefined handling');
87
+ console.log(' • Verify component prop types');
88
+ console.log(' • Run "npm run type-check" to see full details');
89
+
90
+ return { success: false, errors: formattedErrors };
91
+ }
92
+ }
93
+
94
+ function main() {
95
+ console.log('šŸ” TypeScript Type Check for Angular App\n');
96
+
97
+ const result = runTypeCheck();
98
+
99
+ if (result.success) {
100
+ console.log('\nšŸŽ‰ Type checking completed successfully!');
101
+ process.exit(0);
102
+ } else {
103
+ console.log('\nšŸ’„ Type checking failed. Please fix the errors above.');
104
+ process.exit(1);
105
+ }
106
+ }
107
+
108
+ // Run the script
109
+ main();
@@ -0,0 +1,29 @@
1
+ import {
2
+ APP_INITIALIZER,
3
+ ApplicationConfig,
4
+ provideBrowserGlobalErrorListeners,
5
+ provideZoneChangeDetection,
6
+ } from '@angular/core';
7
+ import { provideRouter } from '@angular/router';
8
+ import { defineCustomElements } from '@trimble-oss/moduswebcomponents/loader';
9
+
10
+ import { routes } from './app.routes';
11
+
12
+ export const appConfig: ApplicationConfig = {
13
+ providers: [
14
+ provideBrowserGlobalErrorListeners(),
15
+ provideZoneChangeDetection({ eventCoalescing: true }),
16
+ provideRouter(routes),
17
+ {
18
+ provide: APP_INITIALIZER,
19
+ useFactory: () => {
20
+ // Pass resourcesUrl to defineCustomElements for logo asset path resolution
21
+ return () =>
22
+ defineCustomElements(window, {
23
+ resourcesUrl: window.location.origin + '/modus-wc/',
24
+ });
25
+ },
26
+ multi: true,
27
+ },
28
+ ],
29
+ };
File without changes
@@ -0,0 +1,4 @@
1
+ <router-outlet />
2
+ @if (devPanelService.isEnabled()) {
3
+ <app-dev-panel />
4
+ }