@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,506 @@
1
+ ---
2
+ description: 6 Modus themes with proper switching and persistence
3
+ globs: ["**/*.tsx", "**/*.ts"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Modus Themes Implementation in React + Vite
8
+
9
+ ## 🎨 **Theme System Overview**
10
+
11
+ **CRITICAL**: This React + Vite application supports **6 Modus themes** with proper theme switching, persistence, and hydration safety.
12
+
13
+ **Available Themes**: 4 Modus themes + 2 Connect themes
14
+
15
+ - `modus-classic-light` / `modus-classic-dark`
16
+ - `modus-modern-light` / `modus-modern-dark`
17
+ - `connect-light` / `connect-dark`
18
+
19
+ ## 🏗️ **Theme Architecture**
20
+
21
+ ### ✅ **ThemeProvider Setup**
22
+
23
+ ```tsx
24
+ // ✅ CORRECT: ThemeProvider in App.tsx
25
+ import { ThemeProvider } from "./contexts/ThemeContext";
26
+
27
+ function App() {
28
+ return (
29
+ <ThemeProvider>
30
+ <ModusProvider>
31
+ <Router>
32
+ <div className="min-h-screen flex flex-col">
33
+ <AppHeader />
34
+ <div className="flex-1">
35
+ <Routes>{/* Routes */}</Routes>
36
+ </div>
37
+ <AppFooter />
38
+ </div>
39
+ </Router>
40
+ </ModusProvider>
41
+ </ThemeProvider>
42
+ );
43
+ }
44
+ ```
45
+
46
+ ### ✅ **Theme Context Implementation**
47
+
48
+ ```tsx
49
+ // ✅ CORRECT: Theme context with hydration safety
50
+ import { useEffect, useState, type ReactNode } from "react";
51
+ import { ThemeContext, type Theme } from "./ThemeContextData";
52
+
53
+ interface ThemeProviderProps {
54
+ children: ReactNode;
55
+ }
56
+
57
+ const VALID_THEMES: Theme[] = [
58
+ "modus-classic-light",
59
+ "modus-classic-dark",
60
+ "modus-modern-light",
61
+ "modus-modern-dark",
62
+ "connect-light",
63
+ "connect-dark",
64
+ ];
65
+
66
+ export function ThemeProvider({ children }: ThemeProviderProps) {
67
+ const [theme, setThemeState] = useState<Theme>("modus-classic-light");
68
+ const [mounted, setMounted] = useState(false);
69
+
70
+ // Derived state
71
+ const isDark = theme.includes("dark");
72
+ const isModern = theme.includes("modern");
73
+
74
+ // Load theme from localStorage on mount
75
+ useEffect(() => {
76
+ if (typeof window !== "undefined") {
77
+ try {
78
+ const savedTheme = window.localStorage.getItem(
79
+ "preferred-theme"
80
+ ) as Theme | null;
81
+
82
+ if (savedTheme && VALID_THEMES.includes(savedTheme)) {
83
+ setThemeState(savedTheme);
84
+ }
85
+ } catch (error) {
86
+ console.warn("Unable to read stored theme preference:", error);
87
+ }
88
+ }
89
+ setMounted(true);
90
+ }, []);
91
+
92
+ // Apply theme to document when it changes
93
+ useEffect(() => {
94
+ if (!mounted) return;
95
+
96
+ const html = document.documentElement;
97
+
98
+ // Set theme attribute (official Modus way)
99
+ html.setAttribute("data-theme", theme);
100
+
101
+ // Save to localStorage
102
+ if (typeof window !== "undefined") {
103
+ try {
104
+ window.localStorage.setItem("preferred-theme", theme);
105
+ } catch (error) {
106
+ console.warn("Unable to persist theme preference:", error);
107
+ }
108
+ }
109
+ }, [theme, mounted]);
110
+
111
+ const setTheme = (newTheme: Theme) => {
112
+ setThemeState(newTheme);
113
+ };
114
+
115
+ // Prevent hydration mismatch by not rendering until mounted
116
+ if (!mounted) {
117
+ return <>{children}</>;
118
+ }
119
+
120
+ return (
121
+ <ThemeContext.Provider value={{ theme, setTheme, isDark, isModern }}>
122
+ {children}
123
+ </ThemeContext.Provider>
124
+ );
125
+ }
126
+ ```
127
+
128
+ ## 🎯 **Theme Usage Patterns**
129
+
130
+ ### ✅ **Theme-Aware Components**
131
+
132
+ ```tsx
133
+ // ✅ CORRECT: Theme-aware component
134
+ import { useTheme } from "../hooks/useTheme";
135
+
136
+ function ThemedComponent() {
137
+ const { theme, isDark, isModern } = useTheme();
138
+
139
+ return (
140
+ <div
141
+ className={`
142
+ bg-background text-foreground
143
+ ${isDark ? "border-border" : "border-border"}
144
+ transition-colors duration-200
145
+ `}
146
+ >
147
+ <div className="text-foreground">Current theme: {theme}</div>
148
+ <div className="text-muted-foreground">
149
+ Mode: {isDark ? "Dark" : "Light"}
150
+ </div>
151
+ <div className="text-muted-foreground">
152
+ Style: {isModern ? "Modern" : "Classic"}
153
+ </div>
154
+ </div>
155
+ );
156
+ }
157
+ ```
158
+
159
+ ### ✅ **Conditional Theming**
160
+
161
+ ```tsx
162
+ // ✅ CORRECT: Conditional theming
163
+ function ConditionalThemedComponent() {
164
+ const { theme } = useTheme();
165
+
166
+ const getThemeSpecificContent = () => {
167
+ switch (theme) {
168
+ case "modus-classic-light":
169
+ return "Classic Light Theme";
170
+ case "modus-classic-dark":
171
+ return "Classic Dark Theme";
172
+ case "modus-modern-light":
173
+ return "Modern Light Theme";
174
+ case "modus-modern-dark":
175
+ return "Modern Dark Theme";
176
+ case "connect-light":
177
+ return "Connect Light Theme";
178
+ case "connect-dark":
179
+ return "Connect Dark Theme";
180
+ default:
181
+ return "Default Theme";
182
+ }
183
+ };
184
+
185
+ return (
186
+ <div className="bg-background text-foreground p-4 rounded border border-border">
187
+ <div className="text-lg font-semibold">{getThemeSpecificContent()}</div>
188
+ </div>
189
+ );
190
+ }
191
+ ```
192
+
193
+ ### ✅ **Theme Switching Component**
194
+
195
+ ```tsx
196
+ // ✅ CORRECT: Theme switching component using ModusDropdownMenu
197
+ import ModusDropdownMenu from "./ModusDropdownMenu";
198
+ import type { MenuItem } from "./ModusMenu";
199
+
200
+ function ThemeSwitcher() {
201
+ const { theme, setTheme } = useTheme();
202
+
203
+ const handleItemSelect = (event: CustomEvent<{ value: string }>) => {
204
+ setTheme(event.detail.value as Theme);
205
+ };
206
+
207
+ const themes = [
208
+ { value: "modus-classic-light", label: "Classic Light" },
209
+ { value: "modus-classic-dark", label: "Classic Dark" },
210
+ { value: "modus-modern-light", label: "Modern Light" },
211
+ { value: "modus-modern-dark", label: "Modern Dark" },
212
+ { value: "connect-light", label: "Connect Light" },
213
+ { value: "connect-dark", label: "Connect Dark" },
214
+ ];
215
+
216
+ const menuItems: MenuItem[] = themes.map((themeOption) => ({
217
+ label: themeOption.label,
218
+ value: themeOption.value,
219
+ selected: theme === themeOption.value,
220
+ }));
221
+
222
+ return (
223
+ <div className="space-y-2">
224
+ <div className="text-sm font-medium text-foreground">Theme</div>
225
+ <ModusDropdownMenu
226
+ menuItems={menuItems}
227
+ onItemSelect={handleItemSelect}
228
+ buttonContent={
229
+ <div className="flex items-center justify-between w-full px-3 py-2">
230
+ <span>
231
+ {themes.find((t) => t.value === theme)?.label || "Select Theme"}
232
+ </span>
233
+ <i className="modus-icons">expand_more</i>
234
+ </div>
235
+ }
236
+ />
237
+ </div>
238
+ );
239
+ }
240
+ ```
241
+
242
+ ## 🎨 **Advanced Theme Patterns**
243
+
244
+ ### ✅ **Theme-Specific Styling**
245
+
246
+ ```tsx
247
+ // ✅ CORRECT: Theme-specific styling
248
+ function ThemeSpecificComponent() {
249
+ const { theme, isDark, isModern } = useTheme();
250
+
251
+ const getThemeClasses = () => {
252
+ if (isModern) {
253
+ return isDark
254
+ ? "bg-card text-card-foreground border-border rounded-lg p-4 shadow-lg"
255
+ : "bg-card text-card-foreground border-border rounded-lg p-4 shadow-md";
256
+ } else {
257
+ return isDark
258
+ ? "bg-card text-card-foreground border-border rounded p-4"
259
+ : "bg-card text-card-foreground border-border rounded p-4";
260
+ }
261
+ };
262
+
263
+ return (
264
+ <div className={getThemeClasses()}>
265
+ <div className="text-lg font-semibold">Theme-specific styling</div>
266
+ <div className="text-sm text-muted-foreground">
267
+ This component adapts to the current theme
268
+ </div>
269
+ </div>
270
+ );
271
+ }
272
+ ```
273
+
274
+ ### ✅ **Theme Persistence**
275
+
276
+ ```tsx
277
+ // ✅ CORRECT: Theme persistence with localStorage
278
+ function PersistentThemeComponent() {
279
+ const { theme, setTheme } = useTheme();
280
+
281
+ const saveThemePreference = (newTheme: Theme) => {
282
+ setTheme(newTheme);
283
+ // Theme is automatically saved to localStorage by ThemeProvider
284
+ };
285
+
286
+ const resetTheme = () => {
287
+ setTheme("modus-classic-light");
288
+ };
289
+
290
+ return (
291
+ <div className="space-y-4">
292
+ <div className="text-foreground">Current theme: {theme}</div>
293
+
294
+ <div className="flex space-x-2">
295
+ <button
296
+ onClick={() => saveThemePreference("modus-modern-dark")}
297
+ className="px-4 py-2 bg-primary text-primary-foreground rounded hover:bg-primary/90"
298
+ >
299
+ Set Modern Dark
300
+ </button>
301
+
302
+ <button
303
+ onClick={() => saveThemePreference("connect-light")}
304
+ className="px-4 py-2 bg-secondary text-secondary-foreground rounded hover:bg-secondary/90"
305
+ >
306
+ Set Connect Light
307
+ </button>
308
+
309
+ <button
310
+ onClick={resetTheme}
311
+ className="px-4 py-2 bg-muted text-muted-foreground rounded hover:bg-muted/90"
312
+ >
313
+ Reset
314
+ </button>
315
+ </div>
316
+ </div>
317
+ );
318
+ }
319
+ ```
320
+
321
+ ### ✅ **Theme Validation**
322
+
323
+ ```tsx
324
+ // ✅ CORRECT: Theme validation
325
+ function ThemeValidation() {
326
+ const { theme } = useTheme();
327
+
328
+ const validateTheme = (themeToCheck: string) => {
329
+ const validThemes = [
330
+ "modus-classic-light",
331
+ "modus-classic-dark",
332
+ "modus-modern-light",
333
+ "modus-modern-dark",
334
+ "connect-light",
335
+ "connect-dark",
336
+ ];
337
+
338
+ return validThemes.includes(themeToCheck);
339
+ };
340
+
341
+ const isValidTheme = validateTheme(theme);
342
+
343
+ return (
344
+ <div className="bg-background text-foreground p-4 rounded border border-border">
345
+ <div className="text-lg font-semibold">Theme Validation</div>
346
+ <div className="text-sm text-muted-foreground">
347
+ Current theme: {theme}
348
+ </div>
349
+ <div
350
+ className={`text-sm ${
351
+ isValidTheme ? "text-success" : "text-destructive"
352
+ }`}
353
+ >
354
+ {isValidTheme ? "Valid theme" : "Invalid theme"}
355
+ </div>
356
+ </div>
357
+ );
358
+ }
359
+ ```
360
+
361
+ ## 🔧 **Theme Testing**
362
+
363
+ ### ✅ **Theme Testing Component**
364
+
365
+ ```tsx
366
+ // ✅ CORRECT: Theme testing component
367
+ function ThemeTest() {
368
+ const { theme, setTheme } = useTheme();
369
+
370
+ const testThemes = [
371
+ "modus-classic-light",
372
+ "modus-classic-dark",
373
+ "modus-modern-light",
374
+ "modus-modern-dark",
375
+ "connect-light",
376
+ "connect-dark",
377
+ ];
378
+
379
+ const testAllThemes = () => {
380
+ testThemes.forEach((testTheme, index) => {
381
+ setTimeout(() => {
382
+ setTheme(testTheme as Theme);
383
+ console.log(`Testing theme: ${testTheme}`);
384
+ }, index * 1000);
385
+ });
386
+ };
387
+
388
+ return (
389
+ <div className="space-y-4">
390
+ <div className="text-foreground">Current theme: {theme}</div>
391
+
392
+ <button
393
+ onClick={testAllThemes}
394
+ className="px-4 py-2 bg-primary text-primary-foreground rounded hover:bg-primary/90"
395
+ >
396
+ Test All Themes
397
+ </button>
398
+
399
+ <div className="grid grid-cols-2 gap-2">
400
+ {testThemes.map((testTheme) => (
401
+ <button
402
+ key={testTheme}
403
+ onClick={() => setTheme(testTheme as Theme)}
404
+ className={`px-3 py-2 rounded text-sm ${
405
+ theme === testTheme
406
+ ? "bg-primary text-primary-foreground"
407
+ : "bg-muted text-muted-foreground hover:bg-muted/80"
408
+ }`}
409
+ >
410
+ {testTheme}
411
+ </button>
412
+ ))}
413
+ </div>
414
+ </div>
415
+ );
416
+ }
417
+ ```
418
+
419
+ ## 🚫 **Common Anti-Patterns**
420
+
421
+ ### ❌ **Don't Use Hardcoded Themes**
422
+
423
+ ```tsx
424
+ // ❌ WRONG: Hardcoded theme values
425
+ const theme = "modus-classic-light"; // ❌ Hardcoded
426
+ const isDark = theme.includes("dark"); // ❌ Hardcoded logic
427
+
428
+ // ✅ CORRECT: Use theme context
429
+ const { theme, isDark } = useTheme();
430
+ ```
431
+
432
+ ### ❌ **Don't Use Custom Theme Attributes**
433
+
434
+ ```tsx
435
+ // ❌ WRONG: Using custom theme attributes
436
+ html.setAttribute("data-theme", theme);
437
+ html.setAttribute("data-mode", isDark ? "dark" : "light"); // ❌ Custom attribute
438
+ html.classList.add(isDark ? "dark" : "light"); // ❌ Custom classes
439
+
440
+ // ✅ CORRECT: Use only official data-theme attribute
441
+ html.setAttribute("data-theme", theme);
442
+ ```
443
+
444
+ ### ❌ **Don't Ignore Hydration Safety**
445
+
446
+ ```tsx
447
+ // ❌ WRONG: Ignoring hydration safety
448
+ function BadThemeComponent() {
449
+ const { theme } = useTheme();
450
+
451
+ // ❌ This will cause hydration mismatch
452
+ return <div>Theme: {theme}</div>;
453
+ }
454
+
455
+ // ✅ CORRECT: Handle hydration safety
456
+ function GoodThemeComponent() {
457
+ const { theme } = useTheme();
458
+ const [mounted, setMounted] = useState(false);
459
+
460
+ useEffect(() => {
461
+ setMounted(true);
462
+ }, []);
463
+
464
+ if (!mounted) {
465
+ return <div>Loading...</div>;
466
+ }
467
+
468
+ return <div>Theme: {theme}</div>;
469
+ }
470
+ ```
471
+
472
+ ### ❌ **Don't Use Invalid Theme Values**
473
+
474
+ ```tsx
475
+ // ❌ WRONG: Invalid theme values
476
+ setTheme("invalid-theme"); // ❌ Invalid theme
477
+ setTheme("modus-light"); // ❌ Invalid theme format
478
+
479
+ // ✅ CORRECT: Valid theme values
480
+ setTheme("modus-classic-light"); // ✅ Valid
481
+ setTheme("connect-dark"); // ✅ Valid
482
+ ```
483
+
484
+ ## 🎯 **Key Takeaways**
485
+
486
+ 1. **Use Theme Context**: Always use `useTheme` hook for theme access
487
+ 2. **Official Theme Application**: Use only `data-theme` attribute (no custom attributes)
488
+ 3. **Hydration Safety**: Handle hydration mismatches properly
489
+ 4. **Valid Themes**: Only use the 6 valid theme values
490
+ 5. **Persistence**: Themes are automatically persisted to localStorage
491
+ 6. **Testing**: Test all themes to ensure proper functionality
492
+
493
+ ## 🔍 **Theme Implementation Checklist**
494
+
495
+ - [ ] ✅ **ThemeProvider**: Properly configured in App.tsx
496
+ - [ ] ✅ **Theme Context**: Theme context with hydration safety
497
+ - [ ] ✅ **Valid Themes**: Using only the 6 valid theme values
498
+ - [ ] ✅ **Theme Application**: Using only `data-theme` attribute (no custom attributes)
499
+ - [ ] ✅ **Theme Switching**: Proper theme switching functionality
500
+ - [ ] ✅ **Persistence**: Theme persistence with localStorage
501
+ - [ ] ✅ **Testing**: Testing all themes for proper functionality
502
+ - [ ] ✅ **Hydration Safety**: Proper hydration mismatch handling
503
+
504
+ ---
505
+
506
+ **Remember: This React + Vite application supports 6 Modus themes with proper theme switching, persistence, and hydration safety. Always use the theme context for theme access and handle hydration mismatches properly. Test all themes to ensure proper functionality.**