@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,251 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ModusButtonComponent } from '../../components/modus-button.component';
4
+
5
+ /**
6
+ * Home page component.
7
+ *
8
+ * This is the main landing page for the user's application.
9
+ * Edit this component to create your own home page.
10
+ *
11
+ * Getting Started:
12
+ * 1. Customize the hero section with your app's branding
13
+ * 2. Add your own features and content
14
+ * 3. Use Ctrl+Shift+D to open the Dev Panel for component reference
15
+ */
16
+ @Component({
17
+ selector: 'app-home',
18
+ standalone: true,
19
+ imports: [CommonModule, ModusButtonComponent],
20
+ changeDetection: ChangeDetectionStrategy.OnPush,
21
+ template: `
22
+ <div class="min-h-screen flex flex-col bg-background">
23
+ <div class="flex-1 flex flex-col items-center p-8">
24
+ <div class="max-w-4xl w-full space-y-8">
25
+ <!-- Header -->
26
+ <div class="text-center space-y-4">
27
+ <div class="text-4xl font-bold text-foreground">Modus Angular App</div>
28
+ <div class="text-xl text-foreground-60">
29
+ A production-ready Angular boilerplate with Modus Design System integration.
30
+ </div>
31
+ </div>
32
+
33
+ <!-- Dev Panel Hint -->
34
+ <div class="flex justify-center">
35
+ <modus-button color="primary" size="lg" (buttonClick)="openDevPanel()">
36
+ <div class="flex items-center gap-2">
37
+ <i class="modus-icons">code</i>
38
+ <div>Open Dev Panel</div>
39
+ </div>
40
+ </modus-button>
41
+ </div>
42
+
43
+ <!-- Getting Started -->
44
+ <div class="bg-card border-default rounded-lg p-6 space-y-4">
45
+ <div class="text-lg font-semibold text-foreground">Getting Started</div>
46
+ <div class="space-y-4 text-foreground-80">
47
+ <div class="flex gap-3">
48
+ <div
49
+ class="flex-shrink-0 w-6 h-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-sm font-bold"
50
+ >
51
+ 1
52
+ </div>
53
+ <div>
54
+ <div class="font-medium text-foreground">Build Your App</div>
55
+ <div class="text-sm text-foreground-60">
56
+ Start developing in
57
+ <code class="px-1 py-0.5 bg-muted rounded text-sm">src/app/pages/</code>
58
+ - add your routes in
59
+ <code class="px-1 py-0.5 bg-muted rounded text-sm">app.routes.ts</code>.
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <div class="flex gap-3">
64
+ <div
65
+ class="flex-shrink-0 w-6 h-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-sm font-bold"
66
+ >
67
+ 2
68
+ </div>
69
+ <div>
70
+ <div class="font-medium text-foreground">Use the Dev Panel</div>
71
+ <div class="text-sm text-foreground-60">
72
+ Press
73
+ <div class="inline px-1.5 py-0.5 bg-muted rounded text-xs font-mono">
74
+ Ctrl+Shift+D
75
+ </div>
76
+ to browse components, colors, and icons.
77
+ </div>
78
+ </div>
79
+ </div>
80
+ <div class="flex gap-3">
81
+ <div
82
+ class="flex-shrink-0 w-6 h-6 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-sm font-bold"
83
+ >
84
+ 3
85
+ </div>
86
+ <div>
87
+ <div class="font-medium text-foreground">Deploy</div>
88
+ <div class="text-sm text-foreground-60">
89
+ In production, the Dev Panel is automatically hidden. Your app ships clean.
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ </div>
95
+
96
+ <!-- MCP Servers -->
97
+ <div class="bg-card border-default rounded-lg p-6 space-y-4">
98
+ <div class="text-lg font-semibold text-foreground">MCP Servers Included</div>
99
+ <div class="text-sm text-foreground-60 mb-4">
100
+ Pre-configured Model Context Protocol servers for AI-assisted development.
101
+ </div>
102
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
103
+ <div class="p-4 bg-muted rounded-lg">
104
+ <div class="font-medium text-foreground mb-1">Modus Docs MCP</div>
105
+ <div class="text-sm text-foreground-60">
106
+ Access Modus Web Components documentation directly in your AI assistant. Get
107
+ component props, usage examples, and best practices.
108
+ </div>
109
+ </div>
110
+ <div class="p-4 bg-muted rounded-lg">
111
+ <div class="font-medium text-foreground mb-1">Context7 MCP</div>
112
+ <div class="text-sm text-foreground-60">
113
+ Up-to-date library documentation for Angular, Vite, Tailwind, and other
114
+ dependencies.
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+ <!-- Cursor Rules -->
121
+ <div class="bg-card border-default rounded-lg p-6 space-y-4">
122
+ <div class="text-lg font-semibold text-foreground">AI-Powered Development Rules</div>
123
+ <div class="text-sm text-foreground-60 mb-4">
124
+ Comprehensive Cursor rules ensure consistent, high-quality code generation.
125
+ </div>
126
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
127
+ <div class="space-y-3">
128
+ <div class="flex items-start gap-2">
129
+ <i class="modus-icons text-primary mt-0.5">widgets</i>
130
+ <div>
131
+ <div class="font-medium text-foreground">Component Patterns</div>
132
+ <div class="text-sm text-foreground-60">
133
+ Angular integration, state management, event handling for Modus Web Components
134
+ </div>
135
+ </div>
136
+ </div>
137
+ <div class="flex items-start gap-2">
138
+ <i class="modus-icons text-primary mt-0.5">palette</i>
139
+ <div>
140
+ <div class="font-medium text-foreground">Design System Compliance</div>
141
+ <div class="text-sm text-foreground-60">
142
+ Color usage, border utilities, opacity patterns, icon guidelines
143
+ </div>
144
+ </div>
145
+ </div>
146
+ <div class="flex items-start gap-2">
147
+ <i class="modus-icons text-primary mt-0.5">accessibility</i>
148
+ <div>
149
+ <div class="font-medium text-foreground">Accessibility Standards</div>
150
+ <div class="text-sm text-foreground-60">
151
+ Semantic HTML patterns, ARIA attributes, keyboard navigation
152
+ </div>
153
+ </div>
154
+ </div>
155
+ </div>
156
+ <div class="space-y-3">
157
+ <div class="flex items-start gap-2">
158
+ <i class="modus-icons text-primary mt-0.5">dashboard</i>
159
+ <div>
160
+ <div class="font-medium text-foreground">UX Foundations</div>
161
+ <div class="text-sm text-foreground-60">
162
+ Gestalt laws, visual hierarchy, spacing rhythms, interaction patterns
163
+ </div>
164
+ </div>
165
+ </div>
166
+ <div class="flex items-start gap-2">
167
+ <i class="modus-icons text-primary mt-0.5">wrench</i>
168
+ <div>
169
+ <div class="font-medium text-foreground">Development Workflow</div>
170
+ <div class="text-sm text-foreground-60">
171
+ Linting commands, quality gates, testing procedures
172
+ </div>
173
+ </div>
174
+ </div>
175
+ <div class="flex items-start gap-2">
176
+ <i class="modus-icons text-primary mt-0.5">bug</i>
177
+ <div>
178
+ <div class="font-medium text-foreground">Known Issues</div>
179
+ <div class="text-sm text-foreground-60">
180
+ Checkbox value inversion, modal patterns, select vs dropdown
181
+ </div>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ </div>
187
+
188
+ <!-- Quality Automation -->
189
+ <div class="bg-card border-default rounded-lg p-6 space-y-4">
190
+ <div class="text-lg font-semibold text-foreground">Quality Automation</div>
191
+ <div class="text-sm text-foreground-60 mb-4">
192
+ Pre-configured Husky hooks and GitHub workflows for automated quality assurance.
193
+ </div>
194
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
195
+ <div class="p-4 bg-muted rounded-lg">
196
+ <div class="font-medium text-foreground mb-2">Pre-commit Hooks</div>
197
+ <div class="text-sm text-foreground-60 space-y-1">
198
+ <div>TypeScript type checking</div>
199
+ <div>Design system color validation</div>
200
+ <div>Modus icon usage verification</div>
201
+ <div>Border and opacity pattern checks</div>
202
+ </div>
203
+ </div>
204
+ <div class="p-4 bg-muted rounded-lg">
205
+ <div class="font-medium text-foreground mb-2">Linting Scripts</div>
206
+ <div class="text-sm text-foreground-60 space-y-1">
207
+ <div>Inline style detection</div>
208
+ <div>Semantic HTML enforcement</div>
209
+ <div>Icon name validation (700+ icons)</div>
210
+ <div>
211
+ Run all checks with
212
+ <code class="px-1 py-0.5 bg-background rounded text-xs font-mono"
213
+ >npm run lint:all</code
214
+ >
215
+ </div>
216
+ </div>
217
+ </div>
218
+ </div>
219
+ </div>
220
+
221
+ <!-- Footer -->
222
+ <div class="text-center pt-8 box-content">
223
+ <div class="flex items-center justify-center gap-3 mb-3">
224
+ <img src="/angular-icon.svg" alt="Angular" class="h-6 w-6" aria-hidden="true" />
225
+ <div class="text-foreground-40">+</div>
226
+ <img src="/vite.svg" alt="Vite" class="h-6 w-6" aria-hidden="true" />
227
+ </div>
228
+ <div class="text-sm font-mono text-foreground-40">
229
+ 2026 Modus Angular App v1.0.0 + Angular 20 + Vite + Tailwind CSS - Created by Julian
230
+ Oczkowski
231
+ </div>
232
+ </div>
233
+ </div>
234
+ </div>
235
+ </div>
236
+ `,
237
+ })
238
+ export class HomeComponent {
239
+ /**
240
+ * Opens the Dev Panel by dispatching a keyboard event for Ctrl+Shift+D.
241
+ */
242
+ openDevPanel(): void {
243
+ window.dispatchEvent(
244
+ new KeyboardEvent('keydown', {
245
+ ctrlKey: true,
246
+ shiftKey: true,
247
+ key: 'd',
248
+ }),
249
+ );
250
+ }
251
+ }
@@ -0,0 +1,57 @@
1
+ # Theme Service
2
+
3
+ The `ThemeService` manages Modus theme switching in the Angular application.
4
+
5
+ ## Features
6
+
7
+ - **Theme Management**: Switch between Modus Classic, Modern, and Connect themes
8
+ - **Mode Toggle**: Toggle between light and dark modes
9
+ - **Persistence**: Theme preferences are saved to localStorage
10
+ - **System Theme Detection**: Automatically detects and applies system theme preference if no user preference is set
11
+ - **Reactive**: Uses Angular signals for reactive theme updates
12
+
13
+ ## Available Themes
14
+
15
+ - `modus-classic` (Classic theme)
16
+ - `modus-modern` (Modern theme)
17
+ - `connect` (Connect theme)
18
+
19
+ Each theme supports both `light` and `dark` modes.
20
+
21
+ ## Usage
22
+
23
+ ```typescript
24
+ import { ThemeService } from './services/theme.service';
25
+
26
+ export class MyComponent {
27
+ constructor(private themeService: ThemeService) {
28
+ // Get current theme
29
+ const theme = this.themeService.theme();
30
+ const mode = this.themeService.mode();
31
+
32
+ // Set theme
33
+ this.themeService.setTheme('modus-modern', 'dark');
34
+
35
+ // Toggle mode
36
+ this.themeService.toggleMode();
37
+
38
+ // Set theme name only
39
+ this.themeService.setThemeName('modus-classic');
40
+
41
+ // Set mode only
42
+ this.themeService.setMode('light');
43
+ }
44
+ }
45
+ ```
46
+
47
+ ## Theme Service API
48
+
49
+ - `theme: Signal<ThemeName>` - Current theme name signal
50
+ - `mode: Signal<ThemeMode>` - Current mode signal
51
+ - `setTheme(theme: ThemeName, mode?: ThemeMode): void` - Set theme and mode
52
+ - `setThemeName(theme: ThemeName): void` - Set theme name
53
+ - `setMode(mode: ThemeMode): void` - Set mode
54
+ - `toggleMode(): void` - Toggle between light and dark
55
+ - `getThemeConfig(): ThemeConfig` - Get current theme configuration
56
+ - `getFullThemeName(): string` - Get full theme name (e.g., "modus-modern-light")
57
+
@@ -0,0 +1,163 @@
1
+ import { Injectable, signal } from '@angular/core';
2
+
3
+ export type ThemeName = 'modus-classic' | 'modus-modern' | 'connect';
4
+ export type ThemeMode = 'light' | 'dark';
5
+
6
+ export interface ThemeConfig {
7
+ theme: ThemeName;
8
+ mode: ThemeMode;
9
+ }
10
+
11
+ @Injectable({
12
+ providedIn: 'root',
13
+ })
14
+ export class ThemeService {
15
+ private readonly STORAGE_KEY = 'modus-theme-config';
16
+
17
+ // Current theme state
18
+ private _theme = signal<ThemeName>('modus-modern');
19
+ private _mode = signal<ThemeMode>('light');
20
+
21
+ // Public signals for components to react to
22
+ readonly theme = this._theme.asReadonly();
23
+ readonly mode = this._mode.asReadonly();
24
+
25
+ constructor() {
26
+ this.loadTheme();
27
+ this.watchSystemTheme();
28
+ }
29
+
30
+ /**
31
+ * Initialize theme from localStorage or use default
32
+ */
33
+ private loadTheme(): void {
34
+ try {
35
+ const stored = localStorage.getItem(this.STORAGE_KEY);
36
+ if (stored) {
37
+ const config: ThemeConfig = JSON.parse(stored);
38
+ this.setTheme(config.theme, config.mode);
39
+ return;
40
+ }
41
+ } catch (error) {
42
+ console.warn('Failed to load theme from localStorage:', error);
43
+ }
44
+
45
+ // Default theme
46
+ this.setTheme('modus-modern', 'light');
47
+ }
48
+
49
+ /**
50
+ * Watch system theme preference and update if user hasn't set a preference
51
+ */
52
+ private watchSystemTheme(): void {
53
+ if (typeof window === 'undefined' || !window.matchMedia) {
54
+ return;
55
+ }
56
+
57
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
58
+ const handleChange = (e: MediaQueryListEvent | MediaQueryList) => {
59
+ // Only apply system theme if no user preference is stored
60
+ if (!localStorage.getItem(this.STORAGE_KEY)) {
61
+ this._mode.set(e.matches ? 'dark' : 'light');
62
+ this.updateThemeAttributes();
63
+ }
64
+ };
65
+
66
+ mediaQuery.addEventListener('change', handleChange);
67
+ handleChange(mediaQuery);
68
+ }
69
+
70
+ /**
71
+ * Set theme and mode
72
+ */
73
+ setTheme(theme: ThemeName, mode?: ThemeMode): void {
74
+ this._theme.set(theme);
75
+ if (mode) {
76
+ this._mode.set(mode);
77
+ }
78
+ this.updateThemeAttributes();
79
+ this.saveTheme();
80
+ }
81
+
82
+ /**
83
+ * Toggle between light and dark mode
84
+ */
85
+ toggleMode(): void {
86
+ this._mode.set(this._mode() === 'light' ? 'dark' : 'light');
87
+ this.updateThemeAttributes();
88
+ this.saveTheme();
89
+ }
90
+
91
+ /**
92
+ * Set theme name
93
+ */
94
+ setThemeName(theme: ThemeName): void {
95
+ this._theme.set(theme);
96
+ this.updateThemeAttributes();
97
+ this.saveTheme();
98
+ }
99
+
100
+ /**
101
+ * Set mode
102
+ */
103
+ setMode(mode: ThemeMode): void {
104
+ this._mode.set(mode);
105
+ this.updateThemeAttributes();
106
+ this.saveTheme();
107
+ }
108
+
109
+ /**
110
+ * Update HTML attributes for theme
111
+ * This matches the behavior of modus-wc-theme-provider
112
+ */
113
+ private updateThemeAttributes(): void {
114
+ if (typeof document === 'undefined') {
115
+ return;
116
+ }
117
+
118
+ const root = document.documentElement;
119
+ const theme = this._theme();
120
+ const mode = this._mode();
121
+
122
+ // Update data-theme attribute (e.g., "modus-modern-light")
123
+ // This matches how modus-wc-theme-provider sets it
124
+ root.setAttribute('data-theme', `${theme}-${mode}`);
125
+ root.setAttribute('data-mode', mode);
126
+
127
+ // Update class for light/dark
128
+ root.classList.remove('light', 'dark');
129
+ root.classList.add(mode);
130
+ }
131
+
132
+ /**
133
+ * Save theme to localStorage
134
+ */
135
+ private saveTheme(): void {
136
+ try {
137
+ const config: ThemeConfig = {
138
+ theme: this._theme(),
139
+ mode: this._mode(),
140
+ };
141
+ localStorage.setItem(this.STORAGE_KEY, JSON.stringify(config));
142
+ } catch (error) {
143
+ console.warn('Failed to save theme to localStorage:', error);
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Get full theme name (e.g., "modus-modern-light")
149
+ */
150
+ getFullThemeName(): string {
151
+ return `${this._theme()}-${this._mode()}`;
152
+ }
153
+
154
+ /**
155
+ * Get current theme config
156
+ */
157
+ getThemeConfig(): ThemeConfig {
158
+ return {
159
+ theme: this._theme(),
160
+ mode: this._mode(),
161
+ };
162
+ }
163
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Development environment configuration.
3
+ * Dev panel is enabled in development mode.
4
+ */
5
+ export const environment = {
6
+ production: false,
7
+ devPanel: true,
8
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Production environment configuration.
3
+ * Dev panel is disabled in production builds.
4
+ */
5
+ export const environment = {
6
+ production: true,
7
+ devPanel: false,
8
+ };
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Modus 2 Angular + Vite</title>
6
+ <base href="/" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
8
+ <link rel="icon" type="image/x-icon" href="favicon.ico" />
9
+ <link rel="stylesheet" href="/modus-icons.css" />
10
+ </head>
11
+ <body>
12
+ <app-root></app-root>
13
+ </body>
14
+ </html>
@@ -0,0 +1,6 @@
1
+ import { bootstrapApplication } from '@angular/platform-browser';
2
+ import { appConfig } from './app/app.config';
3
+ import { App } from './app/app';
4
+
5
+ bootstrapApplication(App, appConfig)
6
+ .catch((err) => console.error(err));